насмешливый file.bufferedReader () дает исключение NullPointerException - PullRequest
0 голосов
/ 26 августа 2018

Почему file.bufferedReader() дает мне NullPointerException здесь?

val file = mock<File>()
when(file.bufferedReader()).thenThrow(IOException::class.java)

1 Ответ

0 голосов
/ 27 августа 2018

В соответствии с этим потоком Невозможно смоделировать класс BufferedWriter в junit

Вы можете смоделировать классы ввода-вывода Java (включая их конструкторы, поэтому будущие экземпляры также будут высмеиваться) с помощью JMockitбиблиотеки, хотя вы, вероятно, столкнетесь с такими трудностями, как исключение NullPointerException от конструктора Writer () (в зависимости от того, как было выполнено моделирование и какие классы ввода-вывода были смоделированы).

Однако обратите внимание, что API-интерфейс Java IO содержитмного взаимодействующих классов и глубоких иерархий наследования.В вашем примере класс FileWriter также, вероятно, необходимо будет смоделировать, в противном случае будет создан фактический файл.

Кроме того, использование классов ввода-вывода в коде приложения обычно является просто деталью реализации, которую можно легко изменить,Вы можете переключиться с потоков ввода-вывода на пишущие, с обычного ввода-вывода на NIO или использовать, например, новые утилиты Java 8.Или используйте стороннюю библиотеку ввода-вывода.

Итог, просто ужасно плохая идея пытаться высмеивать классы ввода-вывода.Еще хуже, если (как предложено в другом ответе) вы измените клиентский код так, чтобы в SUT вводили Writers и т. Д.Внедрение зависимостей просто не для такого рода вещей.

Вместо этого используйте реальные файлы в локальной файловой системе, предпочтительно из тестового каталога, который можно удалить после теста, и / или используйте фиксированные файлы ресурсов, когда толькочтение.Локальные файлы быстрые и надежные, что приводит к более полезным тестам.Некоторые разработчики скажут, что «тест не является модульным тестом, если он касается файловой системы», но это просто догматический совет.

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