Вы можете сконфигурировать System
с экземпляром PrintStream
, который вы можете затем использовать после вызова Calculation.logTimeTaken
.
Вот пример:
@Test
public void canLogTimeTaken() {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bout);
System.setOut(out);
Calculation sut = new Calculation();
sut.logTimeTaken("label", 20 , 2, false);
assertEquals("if isDebug is false label took 0 milliseconds for 2 events!\n", bout.toString());
}
Примечание: тамЗдесь нет необходимости в Mockito, это просто ванильный JUnit, без насмешек.
Но , возможно, будет лучше спроектировать logTimeTaken
для двух различных аспектов:
- Получение сообщения журнала
- Регистрация этого сообщения
Например:
public String createTimeTakenMessage(String label, long estimatedTime, int size, boolean isDebug) {
return label + " took " + TimeUnit.MILLISECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS) + " milliseconds for " + size + " events!";
}
public void logTimeTaken(String message) {
System.out.println(message);
}
Тогда проверка createTimeTakenMessage
тривиальна, и вы можете дажерешите вообще не проверять logTimeTaken
, поскольку все, что он делает, это вызывает системный метод.Или, возможно, вы бы скрыли «действие журнала» за интерфейсом с реализацией, использующей System.out
сейчас и, возможно, позже, с другими реализациями, использующими формальную структуру ведения журналов, такую как Logback.