Тестирование сообщений журнала, созданных Slf4j без использования Log4J - PullRequest
1 голос
/ 15 апреля 2019

Я хочу проверить метод, создает ли он правильные журналы или нет. Мой класс выглядит так:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

class EventLogHandler {
    private final Logger logger = LoggerFactory.getLogger(EventLogHandler.class);
    private final Marker eventMarker = MarkerFactory.getMarker("EVENT");

    public void handle(final Event event) {
        final String log = SomeOtherClass.createLog(event);
        logger.info(eventMarker, log);
    }
}

Я видел несколько примеров / решений для тестирования журналов, но все они используют Log4j, который мы не используем в проекте. Я могу использовать только Log4j2 из Spring-boot, Slf4j и Logback classic. Как я могу проверить этот метод handle (...) с моими существующими зависимостями?

1 Ответ

1 голос
/ 15 апреля 2019

В текущей реализации вы не можете тестировать / проверять вызовы на 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 для проверки звонков на него так же, как показано выше ..

...