Написание теста вроде этого - хорошее место для использования mock:
// code with Mockito
@Test
public void testPrint(){
PrintStream mockedPrintStream = Mockito.mock(PrintStream.class);
PrintStream old = System.out;
System.setOut(mockedPrintStream);
obj.print();
Mockito.verify(mockedPrintStream).println("hello");
System.setOut(old); // add this line when edit
}
Теперь вы проверяете, вызывается ли метод с параметром.
Подробнее о насмешках в Руководстве по мокито
Редактировать - ответить на вопрос из комментария
PrintStream old = System.out;
вам нужна эта строка, потому что в System.out
является внешним кодом, и после теста вы должны очистить состояние всех объектов, которые вы загрязнили во время теста.
В большинстве случаев эта очистка происходит методом @TearDown
или просто потому, что объекты были удалены GC при возврате метода @Test
.
В этом случае вам нужно сделать это вручную и в тестовом методе, потому что нет другого места, где вы можете восстановить состояние свойства System.out
до состояния перед тестированием.