Junit测试日志语句

时间:2016-08-09 22:26:46

标签: java unit-testing logging junit 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";
    }
}

我正在编写一个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");
    }
}

我的目标是编写一个测试用例来测试something方法的返回值 AND 日志记录语句,以确保记录某些内容。我花了好几个小时在网上搜索如何设置junit来测试日志记录语句。我已尝试thisthisthisthis方法无济于事。

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

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");
    }
}

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

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

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

2 个答案:

答案 0 :(得分:7)

当然!

  • 创建您自己的自定义内存单例Appender
  • 除了要执行的所有其他日志记录外,修改测试记录器配置以记录到此appender
  • 每次测试{li> clear() @Begin
  • 在测试结束前正常测试它。

事实上,SLF4J已经有an implementation这个你可以看一下。

答案 1 :(得分:0)