我有一些记录HTTP请求的代码。出于合规性原因,我必须确保某些事情没有记录,所以我进行了单元测试。基本的测试结构类似于:
private ListAppender<ILoggingEvent> addListAppender() {
ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
listAppender.start();
ch.qos.logback.classic.Logger loggingHandlerLogger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LoggingHandler.class);
loggingHandlerLogger.addAppender(listAppender);
return listAppender;
}
private void detachAppender(ListAppender<ILoggingEvent> listAppender) {
ch.qos.logback.classic.Logger loggingHandlerLogger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LoggingHandler.class);
loggingHandlerLogger.detachAppender(listAppender);
listAppender.stop();
}
@Test
public void testResponseCookieKeysButNotValuesAreLogged() throws Exception {
ListAppender<ILoggingEvent> listAppender = addListAppender();
try {
// ... do things that cause logging
assertThat(countInListContaining(listAppender.list, cookie1Value)).isEqualTo(0);
// etc.
} finally {
detachAppender(listAppender);
}
}
这有效除了我的测试不是独立的。我的测试是连续运行的(通过Gradle,并行测试被禁用),但似乎有一场比赛,因此有时前一次测试产生的日志会在下一次测试中以listAppender
结束。
我认为正在发生的事情是测试A产生了一些日志,因此Logger拥有它们。然后,测试B在Logger
有机会将这些消息发送到所有appender之前运行。测试B附加ListAppender
,然后测试A中的一些消息被发送到新的appender。我认为我需要做的是在添加新的appender之前以某种方式确保Logger
为“空”但我在flush
上看不到类似Logger
方法的内容。在添加新的appender之前,如何确保处理先前测试的所有日志?