使用log4j2和mockito声明日志消息

时间:2015-03-30 21:50:37

标签: java junit mockito log4j2

我最近开始使用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 个答案:

答案 0 :(得分:2)

mockAppender只是一个模拟对象。如果您没有在@Before方法中跟随行,那么没有任何工作。

<script type="text/javascript">
    var inProgress;
    $( document ).ajaxStart(function() 
    {
        if ( inProgress )
        {
            $( '#main-status-dialog' ).hide();
        }
    });
</script>

就我而言,它对我有用。

答案 1 :(得分:0)

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

首先,在日志消息上断言似乎有点奇怪,但我确定你有理由。

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

或者考虑如何将记录器配置到组件。可能更容易模仿这种依赖。