gpt4 book ai didi

java - 不使用 Log4J 测试 Slf4j 创建的日志消息

转载 作者:行者123 更新时间:2023-11-30 05:40:56 25 4
gpt4 key购买 nike

我想测试一种方法是否创建正确的日志。我的类(class)如下所示:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

class EventLogHandler {
private final Logger logger = LoggerFactory.getLogger(EventLogHandler.class);
private final Marker eventMarker = MarkerFactory.getMarker("EVENT");

public void handle(final Event event) {
final String log = SomeOtherClass.createLog(event);
logger.info(eventMarker, log);
}
}

我已经看到了一些测试日志的示例/解决方案,但它们都使用 Log4j,我们在项目中没有使用 Log4j。我只能使用spring-boot的Log4j2、Slf4j和Logback classic。如何使用现有的依赖项测试该handle(...) 方法?

最佳答案

在当前的实现中,如果不使用日志系统并对其输出进行断言,则无法测试/验证对 logger 的调用,例如引入 logback 并使用 stdout 附加程序配置它并捕获 stdout 并对其进行断言等。

为了测试您的类而不执行任何操作,您必须获得 EventLogHandler 中使用的 logger 实例。当前的实现通过像这样构造 logger 使这变得困难:

private final Logger logger = LoggerFactory.getLogger(EventLogHandler.class);

在此场景中进行测试的常见方法是重构记录器的创建,以便在运行测试时将模拟实例注入(inject)到 EventLogHandler 中。例如:

class EventLogHandler {
private final Marker eventMarker = MarkerFactory.getMarker("EVENT");
private final Logger logger;

public EventLogHandler() {
this(LoggerFactory.getLogger(EventLogHandler.class));
}

// probably only used by your test case
public EventLogHandler(Logger logger) {
this.logger = logger;
}

public void handle(final Event event) {
logger.info(eventMarker, log);
}
}

然后像这样测试它:

@Test
public void someTest() {
Logger logger = Mockito.mock(Logger.class);
EventLogHandler sut = new EventLogHandler(logger);

sut.handle(event);

// verify that the right state is extracted from the given event and that the correct marker is used
Mockito.verify(logger).info(..., ...);
}

一种不太常见的替代方法是使用 Powermock 来模拟此调用:LoggerFactory.getLogger(EventLogHandler.class);,然后使用 Mockito 以与以下相同的方式验证对其的调用:如上所示..

关于java - 不使用 Log4J 测试 Slf4j 创建的日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692187/

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