如何通过JUnit测试拦截SLF4J(带日志备份)日志记录?
是否有可能以某种方式拦截日志记录(SLF4J + logback)并通过JUnit测试用例获取(或其他可读的东西)...?InputStream
是否有可能以某种方式拦截日志记录(SLF4J + logback)并通过JUnit测试用例获取(或其他可读的东西)...?InputStream
Slf4j API不提供这种方式,但Logback提供了一个简单的解决方案。
您可以使用ListAppender
:一个白盒日志回溯追加器,其中日志条目被添加到我们可以用来进行断言的字段中。public List
下面是一个简单的示例。
傅类 :
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Foo {
static final Logger LOGGER = LoggerFactory.getLogger(Foo .class);
public void doThat() {
logger.info("start");
//...
logger.info("finish");
}
}
FooTest 类 :
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
public class FooTest {
@Test
void doThat() throws Exception {
// get Logback Logger
Logger fooLogger = (Logger) LoggerFactory.getLogger(Foo.class);
// create and start a ListAppender
ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
listAppender.start();
// add the appender to the logger
fooLogger.addAppender(listAppender);
// call method under test
Foo foo = new Foo();
foo.doThat();
// JUnit assertions
List<ILoggingEvent> logsList = listAppender.list;
assertEquals("start", logsList.get(0)
.getMessage());
assertEquals(Level.INFO, logsList.get(0)
.getLevel());
assertEquals("finish", logsList.get(1)
.getMessage());
assertEquals(Level.INFO, logsList.get(1)
.getLevel());
}
}
您还可以将 Matcher/assertion 库用作 AssertJ 或 Hamcrest。
使用 AssertJ,它将是:
import org.assertj.core.api.Assertions;
Assertions.assertThat(listAppender.list)
.extracting(ILoggingEvent::getFormattedMessage, ILoggingEvent::getLevel)
.containsExactly(Tuple.tuple("start", Level.INFO), Tuple.tuple("finish", Level.INFO));
您可以创建自定义追加器
public class TestAppender extends AppenderBase<LoggingEvent> {
static List<LoggingEvent> events = new ArrayList<>();
@Override
protected void append(LoggingEvent e) {
events.add(e);
}
}
并配置日志回测.xml以使用它。现在,我们可以检查测试中的日志记录事件:
@Test
public void test() {
...
Assert.assertEquals(1, TestAppender.events.size());
...
}
注意:如果未获得任何输出,请使用 - 有关推理,请参阅注释部分。ILoggingEvent