Тест Junit для вывода в консоль - PullRequest
1 голос
/ 21 октября 2019

Тем не менее я не смог найти причину сбоя метода тестирования для следующего метода.

public static void print() {
    System.out.println("hello");
}

Мой метод тестирования Junit выглядит следующим образом

@Test
public void testPrint(){
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   PrintStream ps = new PrintStream(baos);

   PrintStream old = System.out;

   System.setOut(ps);

   //execute the above method
   obj.print();

   System.out.flush();
   System.setOut(old);

   //test method
   String expected = "hello" + "\n";
   assertEquals(expected, baos.toString());
}

Ожидается ошибка AssertionFailed:<hello but was <hello>

Так что проблема должна быть с символом новой строки. Кто-нибудь знает как это исправить?

1 Ответ

1 голос
/ 21 октября 2019

Написание теста вроде этого - хорошее место для использования 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 до состояния перед тестированием.

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