使用log4j2和Mockito进行日志消息断言

4

我最近开始使用log4j2,并且正在尝试在我的单元测试中测试我的日志消息。使用log4j1x api相当简单,但是现在使用log4j2时出现了问题。我正在使用JUnit 4和Mockito。我的想法是创建一个模拟的appender,然后从append方法中捕获Log事件并验证消息。

@Mock
Appender mockAppender;
@Captor
private ArgumentCaptor<LogEvent> logEvent;

在我的@Before方法中,我有以下内容:
LoggerContext ctx = (LoggerContext)LogManager.getContext();
Configuration config = ctx.getConfiguration();
ctx.getConfiguration().addAppender(mockAppender);
LoggerConfig rootConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
rootConfig.setLevel(Level.DEBUG);
rootConfig.addAppender(mockAppender, Level.DEBUG, null);
ctx.updateLoggers();

在我的测试方法中
logger.error("test");
verify(mockAppender, times(1)).append(logEvent.capture());

我收到了一个失败消息,称append方法从未被调用。 有人对此有什么想法吗?谢谢。
2个回答

3

mockAppender是一个模拟对象。如果你的@Before方法中没有以下行,则无法工作。

Mockito.reset(mockAppender);
Mockito.when(mockAppender.getName()).thenReturn("MockAppender");
Mockito.when(mockAppender.isStarted()).thenReturn(true);
Mockito.when(mockAppender.isStopped()).thenReturn(false);

在我的情况下,它对我起作用。

0
(不是真正的答案,但对于评论来说太长且太难读了。)
首先,在日志消息上进行断言似乎有点奇怪,但我相信你有你的理由。
你的方法看起来对我来说没有错。不过,我不确定记录器上下文本身的生命周期,最坏的情况是每个测试类都会新建一个记录器上下文。在这种情况下,你的appender将无法进入生产代码。也许可以简化一下(不使用captor),并调试你的测试(你应该能够在某个地方找到新的appender)。
或者考虑一下如何为组件提供记录器。可能更容易模拟出这种依赖关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接