java - 使用 log4j2 和 mockito 断言日志消息

标签 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 方法。 有人对此有任何想法吗?谢谢

最佳答案

mockAppender 只是一个模拟对象。如果您没有遵循 @Before 方法中的行,则没有任何效果。

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

就我而言,它对我有用。

关于java - 使用 log4j2 和 mockito 断言日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29356990/

相关文章:

java - 使用 Ant 仅运行特定的 JUnit 测试

google-app-engine - 无法在 GWT 上对 RPC 进行单元测试

java - 没有 includeantruntime 的 ant LinkageError

java - 如何为 JUnit 测试模拟 okhttp 响应

java - 如何使用 Mockito 匹配二维数组参数?

java - 文本文件中的多个数组

java - 不兼容的类型 : com. rh.host.Validator<T> 无法转换为 com.rh.host.Pool.Validator<T>

具有自定义 ID 的 Java TimeZone 不考虑夏令时

java - Java中的方法不能直接返回值,为什么?

java - 如何调试 mockito 模拟/ stub /匹配器?