Мне нужно написать JUnit-тесты для старого приложения, которое плохо спроектировано и выдает много сообщений об ошибках в стандартный вывод. Когда getResponse(String request) метод работает правильно, он возвращает XML-ответ:
Я использовал этот код для тестирования опции командной строки (утверждая, что -version выводит строку version и т.д. и т.п.)
Редактировать: Предыдущие версии этого ответа вызывались System.setOut(null) после тестов; Это причина NullPointerExceptions, на которые ссылаются комментаторы.
Ответ 2
Я знаю, что это старый поток, но для этого есть хорошая библиотека: Системные правила Пример из документации:
Это также позволит вам перехватывать System.exit(-1) и другие вещи, для которых потребуется протестировать инструмент командной строки.
Ответ 3
Вместо перенаправления System.out я бы реорганизовал класс, который использует System.out.println(), передав PrintStream в качестве соавтора, а затем используя System.out в производстве и тестовый шпион в тесте. То есть используйте внедрение зависимостей, чтобы исключить прямое использование стандартного выходного потока.
Таким образом, тестируемый класс становится тестируемым с помощью простого рефакторинга, без необходимости косвенного перенаправления стандартного вывода или скрытого перехвата системным правилом.
Ответ 4
Вы можете настроить поток печати System.out с помощью setOut() (и для in и err). Можете ли вы перенаправить это в поток печати, который записывает в строку, а затем проверить это? Это, казалось бы, самый простой механизм.
(Я бы посоветовал на каком-то этапе преобразовать приложение в какую-нибудь платформу ведения журнала - но я подозреваю, что вы уже знаете об этом!)