Вы можете смоделировать классы ввода-вывода Java (включая их конструкторы, поэтому будущие экземпляры также будут высмеиваться) с помощью JMockitбиблиотеки, хотя вы, вероятно, столкнетесь с такими трудностями, как исключение NullPointerException от конструктора Writer () (в зависимости от того, как было выполнено моделирование и какие классы ввода-вывода были смоделированы).
Однако обратите внимание, что API-интерфейс Java IO содержитмного взаимодействующих классов и глубоких иерархий наследования.В вашем примере класс FileWriter также, вероятно, необходимо будет смоделировать, в противном случае будет создан фактический файл.
Кроме того, использование классов ввода-вывода в коде приложения обычно является просто деталью реализации, которую можно легко изменить,Вы можете переключиться с потоков ввода-вывода на пишущие, с обычного ввода-вывода на NIO или использовать, например, новые утилиты Java 8.Или используйте стороннюю библиотеку ввода-вывода.
Итог, просто ужасно плохая идея пытаться высмеивать классы ввода-вывода.Еще хуже, если (как предложено в другом ответе) вы измените клиентский код так, чтобы в SUT вводили Writers и т. Д.Внедрение зависимостей просто не для такого рода вещей.
Вместо этого используйте реальные файлы в локальной файловой системе, предпочтительно из тестового каталога, который можно удалить после теста, и / или используйте фиксированные файлы ресурсов, когда толькочтение.Локальные файлы быстрые и надежные, что приводит к более полезным тестам.Некоторые разработчики скажут, что «тест не является модульным тестом, если он касается файловой системы», но это просто догматический совет.