Junit测试日志语句

Ric*_*ard 9 java logging junit unit-testing slf4j

我有一个类似于foo的java 8应用程序:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Foo {
    private final Logger log = LoggerFactory.getLogger(Foo.class);

    public String something() {
        log.info("doing foo test");
        return "test";
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一个JUnit(Junit 4.11)测试用例,如下所示:

public class FooTest {
    private Foo foo;

    @Before
    public void setUp() throws Exception {
        foo = new Foo();
    }

    @Test
    public void testSomething() {
        String result = foo.something();
        assertEquals(result,"test");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是编写一个测试用例来测试something方法的返回值日志语句,以确保记录某些内容.我花了几个小时搜索网络来弄清楚如何设置junit来测试日志记录语句.我试过这个,这个,这个这个方法无济于事.

我不知道这是不是我做错了什么.但这是我的代码基于最后一个例子:

public class FooTest {
    private Foo foo;
    @Mock private Appender appender;
    @Captor private ArgumentCaptor captor;

    @Before
    public void setUp() throws Exception {
        foo = new Foo();
        MockitoAnnotations.initMocks(this);
        Logger.getRootLogger().addAppender(appender);
    }

    @After
    public void tearDown() throws Exception {
        Logger.getRootLogger().removeAllAppenders();
    }

    @Test
    public void testSomething() {
        String result = foo.something();
        assertEquals(result,"test");
        verify(appender).doAppend(((LoggingEvent) captor.capture()));
        LoggingEvent loggingEvent = (LoggingEvent) captor.getValue();
        assertEquals(loggingEvent.getRenderedMessage(), "doing foo test");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个时,我收到以下错误:

Wanted but not invoked:
appender.doAppend(<Capturing argument>);
-> at <package>.testSomething(FooTest.java:22)
Actually, there were zero interactions with this mock.
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来实现我想要的?如果这是最好的方式那么我做错了什么?

Tas*_*kos 7

当然!

  • 创建自己的自定义内存中Singleton Appender
  • 除了您将执行的所有其他日志记录之外,还修改测试记录器配置以记录到此appender
  • clear() 它在每次测试中 @Begin
  • 在测试结束之前正常测试它.

事实上,SLF4J已经实现了这个,你可以看看.