java-8 - 使用 Mockito、TestNG 和 Log4j2 断言日志消息
问题描述
我一直在关注asserting-log-messages-with-log4j2-and-mockito来编写 TestNG 测试来测试 Log4j2 的日志记录。帖子中写的大部分内容似乎都有效。但是,当我运行测试时,我得到:
Wanted but not invoked:
appender.append(<Capturing argument>);
-> at LoggingTest.test(LoggingTest.java:105)
However, there were exactly 2 interactions with this mock:
appender.getName();
-> at org.apache.logging.log4j.core.config.AbstractConfiguration.addAppender(AbstractConfiguration.java:603)
appender.getName();
-> at org.apache.logging.log4j.core.config.AppenderControl.<init>(AppenderControl.java:51)
我的 TestNGclass 是:
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.mockito.ArgumentCaptor;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class LoggingTest {
private Appender appender;
private ArgumentCaptor<LogEvent> captor;
@BeforeMethod
public void setUp() {
appender = mock(Appender.class);
captor = ArgumentCaptor.forClass(LogEvent.class);
reset(appender);
when(appender.getName()).thenReturn("Appender");
when(appender.isStarted()).thenReturn(true);
when(appender.isStopped()).thenReturn(false);
LoggerContext context = (LoggerContext)LogManager.getContext();
Configuration config = context.getConfiguration();
config.addAppender(appender);
LoggerConfig rootConfig = config.getRootLogger();
rootConfig.setLevel(Level.INFO);
rootConfig.addAppender(appender, Level.INFO, null);
context.updateLoggers();
}
@Test
public void test() {
LogManager.getLogger().info("testing");
verify(appender).append(captor.capture());
LogEvent logEvent = captor.getValue();
assertThat(logEvent.getMessage()).isEqualTo("test");
}
}
我一直在看这个一段时间,并没有找到我的错误。有人能指出我正确的方向吗?
解决方案
推荐阅读
- java - Java 设置一个简单的代理
- mongodb - findOneAndUpdate 不更新对象 - Mongoose
- sql - 如何将管道从 Azure 数据工厂 V2 移动到另一个(相同的资源组)?
- python - 如果以文本文件中的数值开头,则查找行的总和
- assembly - 英特尔引脚工具:无法使用 icc 识别用户定义的函数
- kotlin - 在 Kotlin 中构建 hamcrest 地图匹配器的问题
- objective-c - 使用 NSMagnificationGestureRecognizer 缩放 NSScrollView
- cordova - Ionic 无法构建或运行应用程序
- ignite - 点燃内存消耗 vs Redis
- bash - 如何在 shell 脚本中获取动态路径?