У меня есть специальный модуль добавления Log4j2, который используется во многих моих тестах JUnit5.
(Что бы это ни стоило, я наткнулся на код в паре статей и сделал лишь незначительные изменения. корректировки.)
При запуске в Surefire журналы, созданные как часть тестируемой системы, не дают ожидаемых значений, если я использую настройки плагина Surefire по умолчанию, поскольку он использует несколько потоков для ускорить работу.
В частности, выходной поток пользовательского приложения ровно один раз содержит то, что я ожидаю, и пуст в остальные дни.
Такое поведение отслеживается с распараллеливанием Surefire: если я устанавливаю для reuseForks значение false, все работает нормально, но, конечно, набор тестов работает намного медленнее.
Я пробовал синхронизировать методы в расширении журнала, но безрезультатно (что, я думаю, имеет смысл, учитывая, что я, вероятно, во власти LogManager и контекста, который он возвращает, тогда как каждый тест должен создавать экземпляр зарегистрированного расширения в своем собственном потоке ). Вероятно, я что-то неправильно понимаю или упускаю что-то очевидное - или, возможно, то, что я пытаюсь сделать, невозможно, и мне следует использовать Spring OutputCaptureExtension (что для меня было бы далеко не идеально).< /p>
Будем очень благодарны за любую помощь.
Заранее спасибо.
Класс LoggerExtension:
public class LoggerExtension implements BeforeEachCallback, AfterEachCallback {
private static final String APPENDER_NAME = "TestAppender";
private ByteArrayOutputStream outContent;
@Override
public void beforeEach(ExtensionContext context) {
if (outContent == null) {
outContent = new ByteArrayOutputStream();
} else {
outContent.reset();
}
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
loggerContext.getConfiguration().getRootLogger().setLevel(Level.INFO);
Appender appender = WriterAppender.newBuilder()
.setName(APPENDER_NAME)
.setTarget(new OutputStreamWriter(outContent))
.build();
appender.start();
loggerContext.getConfiguration().addAppender(appender);
loggerContext.getRootLogger().addAppender(loggerContext.getConfiguration().getAppender(appender.getName()));
loggerContext.updateLoggers();
}
@Override
public void afterEach(ExtensionContext context) {
LoggerContext loggerContext = (LoggerContext) LogManager.getContext();
Configuration configuration = loggerContext.getConfiguration();
configuration.getRootLogger().removeAppender(APPENDER_NAME);
}
public void verifyMessage(String message) {
// outContent is ony valid once; every other time it is empty
assertThat(outContent.toString(), containsString(message));
}
}
Пример тестового примера:
public class TestCase {
@RegisterExtension
public static LoggerExtension logVerifier = new LoggerExtension();
// ...
@Test
public void shouldDoSomething() {
// code that generates logs here
logVerifier.verifyMessage("match the log string");
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ss-threads