Почему getResourceAsStream () возвращает null, если File не существует до запуска метода Test? - PullRequest
0 голосов
/ 03 июня 2019

Прежде чем пометить это как дубликат, пожалуйста, прочитайте вопрос!

У меня есть тест JUnit, который проверяет метод, который записывает свой результат в file.Чтобы проверить результат, я хочу прочитать этот файл результатов и проверить его содержимое.

Проблема заключается в том, что когда файл результатов еще не существует до начала теста, метод getResourceAsStream() возвращает null.

Мой код для теста выглядит примерно так:

@Inject
private ObjectToTest obj

@Test
public void testMethod() throws Exception {
    // Do some setup (inject mocks, set properties of obj, ...)

    obj.method(); // <-- Creates result.txt
    Mockito.verify(obj).method();

    // Thread.sleep(1000); <-- I have tried to use this to wait some time for the result, but it did not work

    // This part is null on the first run of the test
    // When I run the test the second time, the file does already exist and it returns the right InputStream for the File
    InputStream resultInp = this.getClass().getResourceAsStream("/test-out/result.txt");

    String resultStr = IOUtils.toString(resultInp, "UTF-8");

    assertThat(resultStr).isNotNull();
    assertThat(resultStr.split("\n")).hasSize(5);
}

Есть ли какое-либо объяснение, почему это происходит, или оно должно что-то делать с другой частью кода?

Я не нашел ничего относительно этой проблемы в StackOverflow, но если я ошибаюсь, направьте меня к нужному сообщению.

1 Ответ

3 голосов
/ 03 июня 2019

Метод getResourceAsStream() возвращает поток для ресурса на пути к классам, используя информацию каталога / индекса, которая кэшируется загрузчиком классов.Если вы добавите ресурс в какое-либо дерево каталогов или архив на пути к классам после того, как путь к классам был кэширован, загрузчик классов, скорее всего, не «увидит» его 1 .

Это, скорее всего,что произошло в вашем тестовом коде.

Приложение Java не должно пытаться обрабатывать ресурсы загрузчика классов как файловую систему общего назначения.Вместо этого используйте File или Path для обозначения файлов и FileInputStream или аналогичные для их открытия.


1 - Фактическое поведение, по-видимому, не указано в javadocsдля ClassLoader и так далее.Мое описание основано на наблюдаемом / сообщаемом поведении некоторых реализаций Java.

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