测试使用Junit调用了Logback Log语句?

jav*_*999 3 java logging junit unit-testing logback

下面是我尝试为其编写Junit测试的方法:

我想测试的方法:

   //logger declared outside of method in Class
   private static Logger LOGGER = LoggerFactory.getLogger(PersonService.class);

    public void showOutputOfIdentifications(int age) {

        if(age>25){

            LOGGER.info("Over 25");

        }else{

            LOGGER.info("25 or Under");

        }
     }
Run Code Online (Sandbox Code Playgroud)

如何测试以验证是否Logback已调用正确的Log语句?

在我的测试中,我尝试模拟logger并验证它是否被调用,但是这没有用?

当前的测试尝试:

 @Test
    public void testShowOutputOfIdentifications() throws ParseException{

    int age = 10;

    Logger LOGGER_mock = mock(Logger.class);

    //call method under test
    showOutputOfIdentifications(age);

    verify(LOGGER_mock).info("25 or under");


}
Run Code Online (Sandbox Code Playgroud)

当前失败的测试输出:

Wanted but not invoked:
logger.info(
    "25 or under "
);

Actually, there were zero interactions with this mock.
Run Code Online (Sandbox Code Playgroud)

小智 8

您可以添加自己的追加程序,并断言日志消息是以这种方式编写的,请参阅以编程方式配置LogBack追加程序

像这样:

// create the mock appender
Appender mockedAppender = Mockito.mock(Appender.class);

// inject it
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).addAppender(mockedAppender);

// run your test
LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME).error("Test msg");

// verify using ArgumentCaptor
ArgumentCaptor<Appender> argumentCaptor = ArgumentCaptor.forClass(Appender.class);
Mockito.verify(mockedAppender).doAppend(argumentCaptor.capture());

// assert against argumentCaptor.getAllValues()
Assert.assertEquals(1, argumentCaptor.getAllValues().size());
Assert.assertEquals("Test msg", ((LoggingEvent)argumentCaptor.getAllValues().get(0)).getMessage());

// remove the mock appender from static context
((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).detachAppender(mockedAppender);
Run Code Online (Sandbox Code Playgroud)