首页 文章

使用log4j2和mockito声明日志消息

提问于
浏览
3

我最近开始使用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

    mockAppender只是一个模拟对象 . 如果你没有在@Before方法中跟踪行,那么什么都行不通 .

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

    就我而言,它对我有用 .

  • 2

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

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

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

    或者考虑如何将 Logger 配置到组件 . 可能更容易模拟这种依赖 .

相关问题