【问题标题】:Junit testing log statementsJunit 测试日志语句
【发布时间】:2016-12-16 03:07:09
【问题描述】:

我有一个 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.

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

【问题讨论】:

标签: java unit-testing logging junit slf4j


【解决方案1】:

当然!

  • 创建您自己的自定义内存中 Singleton Appender
  • 修改测试记录器配置以记录到此附加程序以及您将执行的所有其他日志记录
  • clear() 在每次测试期间@Begin
  • 在测试结束前正常断言测试它。

其实SLF4J已经有an implementation这个了,大家可以看看。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多