В текущей реализации вы не можете тестировать / проверять вызовы на logger
, не задействуя систему ведения журнала и не утверждая на ее выходе, например, введя logback и сконфигурировав его с приложением stdout, перехватив stdout и заявив о нем и т. Д.
Чтобы протестировать свой класс, ничего не делая, вы должны взять в руки экземпляр logger
, используемый в EventLogHandler
.Текущая реализация делает это трудным, создавая logger
следующим образом:
private final Logger logger = LoggerFactory.getLogger(EventLogHandler.class);
Общий подход к тестированию в этом сценарии заключается в рефакторинге создания регистратора таким образом, что вы можете внедрить макетированный экземплярв EventLogHandler
при запуске ваших тестов.Например:
class EventLogHandler {
private final Marker eventMarker = MarkerFactory.getMarker("EVENT");
private final Logger logger;
public EventLogHandler() {
this(LoggerFactory.getLogger(EventLogHandler.class));
}
// probably only used by your test case
public EventLogHandler(Logger logger) {
this.logger = logger;
}
public void handle(final Event event) {
logger.info(eventMarker, log);
}
}
Затем проверьте это следующим образом:
@Test
public void someTest() {
Logger logger = Mockito.mock(Logger.class);
EventLogHandler sut = new EventLogHandler(logger);
sut.handle(event);
// verify that the right state is extracted from the given event and that the correct marker is used
Mockito.verify(logger).info(..., ...);
}
Менее распространенной альтернативой будет использование Powermock, чтобы позволить вам смоделировать этот вызов: LoggerFactory.getLogger(EventLogHandler.class);
, а затем использоватьMockito для проверки звонков на него так же, как показано выше ..