运行单元测试

时间:2015-10-07 10:51:52

标签: unit-testing log4j mockito slf4j

我正在尝试对我的代码中生成的日志语句进行单元测试。我正在使用slfj,log4j和Mockito。我正在使用博客中的类似代码 http://bloodredsun.com/2010/12/09/checking-logging-in-unit-tests/

当我运行测试时,它抛出异常,说明在线上有0个调用:

verify(mockAppender).doAppend(captorLoggingEvent.capture());

错误消息

  

想要但未被调用:mockAppender.doAppend();    - >在testClass.testLogAdviceAfterReturning(DpsOpsLoggerTest2.java:94)实际上,这个模拟没有交互。

我看到控制台上印有日志。请求您帮助。

@RunWith(MockitoJUnitRunner.class)
public class ExampleThatLogsTest {

    @Mock
    private Appender mockAppender;
    @Captor
    private ArgumentCaptor captorLoggingEvent;

    @Before
    public void setup() {
        LogManager.getRootLogger().addAppender(mockAppender);
    }

    @After
    public void teardown() {
        LogManager.getRootLogger().removeAppender(mockAppender);
    }

    @Test
    public void shouldConcatAndLog() {
        //given
        ExampleThatLogs example = new ExampleThatLogs();
        //when
        String result = example.concat("foo", "bar");
        //then
        assertEquals("foobar", result);

        verify(mockAppender).doAppend(captorLoggingEvent.capture());
        LoggingEvent loggingEvent = captorLoggingEvent.getValue();
        //Check log level
        assertThat(loggingEvent.getLevel(), is(Level.INFO));
        //Check the message being logged
        assertThat(loggingEvent.getRenderedMessage(), 
            is("String a:foo, String b:bar"));
    }
}

2 个答案:

答案 0 :(得分:1)

我试图模仿你的情况,在我的结尾它工作正常

// Log Util

        public class LogUtil{

        final static Logger logger = Logger.getLogger(LogUtil.class);

        public static Log`enter code here`ger getLogger()
        {
            return logger;
        }

// class

public class RunMe {

        public String runMe(String parameter) {

            LogUtil.getLogger().info("This is info : " + parameter);
            return "In runner " + parameter;

        }
    }

//单元测试

@RunWith(MockitoJUnitRunner.class)
public class LoggerTest {

    @Mock
    private Appender mockAppender;
    @Captor
    private ArgumentCaptor captorLoggingEvent;

    @Before
    public void setup() {

        LogUtil.getLogger().addAppender(mockAppender);
        }

    @Test
    public void shouldConcatAndLog() {

        RunMe runner=new RunMe();
        String result=runner.runMe("XYZ");
        assertEquals("In runner XYZ",result);
       verify(mockAppender).doAppend((LoggingEvent) captorLoggingEvent.capture());
      LoggingEvent logevent= (LoggingEvent) captorLoggingEvent.getValue();
      assertThat(logevent.getLevel(), is(Level.INFO));
    }

    @After
    public void tearDown() {
        LogUtil.getLogger().removeAllAppenders();
    }
}

答案 1 :(得分:0)

我知道这有点过时,但我也在努力解决这个问题。我正在测试的类中以DEBUG级别记录语句。我在测试中的类的logback.xml中的配置设置为INFO。将我的日志语句更改为INFO允许测试通过。另外,我还阅读了this Github帖子,它非常简洁,是一个测试日志输出的干净实现。希望其他人会觉得它很有用。