gpt4 book ai didi

java - 如何通过 JUnit 测试拦截 SLF4J(带 logback)日志记录?

转载 作者:IT老高 更新时间:2023-10-28 20:41:24 24 4
gpt4 key购买 nike

是否有可能以某种方式拦截日志记录(SLF4J + logback)并通过 JUnit 测试用例获取 InputStream(或其他可读的内容)...?

最佳答案

Slf4j API 没有提供这种方式,但 Logback 提供了一个简单的解决方案。

您可以使用 ListAppender : 一个白盒 logback appender,其中日志条目被添加到 public List 字段中,我们可以使用它来进行断言。

这是一个简单的例子。

Foo 类:

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));

关于java - 如何通过 JUnit 测试拦截 SLF4J(带 logback)日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com