2015-03-30 131 views
3

我最近开始使用log4j2,我试图在我的单元测试中测试我的日志消息。这对于log4j1x API来说非常简单,但是现在使用log4j2并不能正常工作。我正在使用JUnit 4和Mockito。我的想法是创建一个模拟appender,然后从append方法中捕获Log事件并验证消息。断言与log4j2和mockito的日志消息

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

我得到一个失败的话说,追加方法不会被调用。有人对此有任何想法吗?由于

回答

0

(不是一个真正的答案,但太长,太难读了评论。)

一开始似乎有点古怪主张在日志消息,但我敢肯定,你有你原因。

你的方法对我来说看起来不错。尽管对于记录器上下文本身的生命周期并不是100%确定的,但最糟糕的情况是,每个被测试的类都会新增一切。在这种情况下,您的appender不会将其转换为生产代码。也许简化一下(没有捕获)和调试你的测试(你应该能够找到新的appender的地方)。

或者考虑如何将记录器配置到组件。嘲笑这种依赖可能会容易得多。

2

mockAppender只是一个模拟对象。如果您在@Before方法中没有跟随行,则无法正常工作。

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

在我的情况下,它适用于我。