Spring Boot Test MalformedURLException: неизвестный протокол: classpath - PullRequest
0 голосов
/ 22 октября 2018

Если java.net.URL используется в приложении Spring Boot с протоколом classpath, оно работает должным образом, поскольку Spring Boot регистрирует URLStreamHandlerFactory.например, new URL("classpath: someFile.whatever").

Но когда этот код выполняется как тест JUnit, генерируется исключение java.net.MalformedURLException: unknown protocol: classpath.

Кажется, что соответствующий URLStreamHandlerFactory не зарегистрирован при инициализации контекста Springдля теста JUnit.

Шаги для воспроизведения:

1) Создайте проект Spring Boot Starter (например, используя только стартовый Web).

2) добавьте test.json файл вsrc/main/resources

3) Добавьте следующий bean-компонент:

@Component
public class MyComponent {
    public MyComponent() throws MalformedURLException {
        URL testJson = new URL("classpath: test.json");
        System.out.println(testJson);
    }
}

4) Запуск приложения как Java-приложения работает ОК

5) Запустите стандартный тест contextLoads:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringUrlTestApplicationTests {

    @Test
    public void contextLoads() {
    }

}

java.net.MalformedURLException: unknown protocol: classpath выдается исключение.

Как правильно использовать URL с ресурсами classpath в тесте JUnit?

В реальном случае использованияЯ не могу изменить new URL("classpath: test.json"), потому что он поступил из сторонней библиотеки.

Попытался скопировать test.json в src/test/resources, чтобы проверить, может ли ошибка быть вызвана отсутствующим ресурсом - безуспешно.

Ответы [ 5 ]

0 голосов
/ 31 октября 2018

Проблема в том, что класс, который обрабатывает протокол, org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.Вы можете исправить свой тест следующим образом:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MalformedUrlApplicationTests {

    @Test
    public void contextLoads() {
    }

}

Но я думаю, что @borino ответ лучше.

0 голосов
/ 30 октября 2018

Spring не имеет URLStreamHandler, который может обрабатывать URL для протокола "classpath:".Spring обрабатывает этот протокол с помощью ResourceLoader API.После загрузки ресурса вы можете получить URL-адрес для него.

Однако Java предоставляет механизм поддержки нестандартных протоколов.Я нашел запись StackOverflow, которая должна ответить на ваш вопрос.

Поддержка URL Classpath

0 голосов
/ 27 октября 2018

Я предпочитаю следующий способ, используя Apache Commons:

String url = IOUtils.toString(
    this.getClass().getResourceAsStream("test.json"),"UTF-8"
);
URL testJson = new URL(url);

Файл test.json => вы можете хранить в папке src / test / resources -> он будет загружен изздесь, с maven это работает для меня

Дополнительные методы, подобные этим, доступны здесь Как прочитать ресурс текстового файла в модульном тесте Java?

0 голосов
/ 30 октября 2018

Самый короткий и простой способ - создать простой метод перед выполнением теста, который создает и регистрирует обработчики для протокола 'classpath'.

    @BeforeClass
    public static void init() {
        org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.getInstance();
    }

Я только что проверил, и он отлично работает.Этот подход также используется внутри подпружиненных приложений

0 голосов
/ 25 октября 2018

Я думаю, вы можете попробовать автоматически подключить ResourceLoader и загрузить файл с помощью resourceLoader.getResource ("classpath: /test.json"), он загрузит файл из папки ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...