首页 > 解决方案 > 使用 Mockito、TestNG 和 Log4j2 断言日志消息

问题描述

我一直在关注asserting-log-messages-with-log4j2-and-mockito来编写 TestNG 测试来测试 Log4j2 的日志记录。帖子中写的大部分内容似乎都有效。但是,当我运行测试时,我得到:

Wanted but not invoked:
appender.append(<Capturing argument>);
-> at LoggingTest.test(LoggingTest.java:105)

However, there were exactly 2 interactions with this mock:
appender.getName();
-> at org.apache.logging.log4j.core.config.AbstractConfiguration.addAppender(AbstractConfiguration.java:603)

appender.getName();
-> at org.apache.logging.log4j.core.config.AppenderControl.<init>(AppenderControl.java:51)

我的 TestNGclass 是:

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.mockito.ArgumentCaptor;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class LoggingTest {

    private Appender appender;

    private ArgumentCaptor<LogEvent> captor;

    @BeforeMethod
    public void setUp() {
        appender = mock(Appender.class);
        captor = ArgumentCaptor.forClass(LogEvent.class);

        reset(appender);
        when(appender.getName()).thenReturn("Appender");
        when(appender.isStarted()).thenReturn(true);
        when(appender.isStopped()).thenReturn(false);

        LoggerContext context = (LoggerContext)LogManager.getContext();
        Configuration config = context.getConfiguration();
        config.addAppender(appender);
        LoggerConfig rootConfig = config.getRootLogger();
        rootConfig.setLevel(Level.INFO);
        rootConfig.addAppender(appender, Level.INFO, null);
        context.updateLoggers();
    }

    @Test
    public void test() {        
        LogManager.getLogger().info("testing");
        verify(appender).append(captor.capture());
        LogEvent logEvent = captor.getValue();
        assertThat(logEvent.getMessage()).isEqualTo("test");
    }
}

我一直在看这个一段时间,并没有找到我的错误。有人能指出我正确的方向吗?

标签: java-8mockitotestnglog4j2

解决方案


推荐阅读