Пользовательское приложение Log4j2 в Maven Surefire: возможно ли повторное использование в потоках?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Пользовательское приложение Log4j2 в Maven Surefire: возможно ли повторное использование в потоках?

Сообщение Anonymous »

У меня есть специальный модуль добавления 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»