我最近开始使用log4j2,我正试图在单元测试中测试我的日志消息。这在log4j1x api中非常简单,但现在在log4j2中它不起作用。我正在使用JUnit 4和Mockito。我的想法是创建一个mock 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方法从未被调用过。有人对此有什么想法吗?感谢
Mockito.reset(mockAppender);
Mockito.when(mockAppender.getName()).thenReturn("MockAppender");
Mockito.when(mockAppender.isStarted()).thenReturn(true);
Mockito.when(mockAppender.isStopped()).thenReturn(false);
在我的情况下,它对我有效。
(不是真正的答案,但太长,太难阅读,无法发表评论。)
首先,在日志消息上断言似乎有点奇怪,但我相信你有自己的理由。
在我看来,你的方法并没有错。虽然不能100%确定记录器上下文本身的生命周期,但最坏的情况是,每个测试中的类都会更新所有内容。在这种情况下,您的appender不会将其生成产品代码。也许可以简化一点(没有captor)并调试您的测试(您应该能够在某个地方找到新的appender)。
或者考虑一下如何为组件提供记录器。模拟这种依赖可能要容易得多。