簡體   English   中英

Junit 測試日志語句

[英]Junit testing log statements

我有一個 java 8 應用程序,帶有 class foo,如下所示:

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方法的返回值日志語句以確保正在記錄某些內容。 我花了幾個小時搜索 web 來弄清楚如何設置 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");
    }
}

但是當我運行它時,出現以下錯誤:

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

有沒有更簡單的方法來完成我想要的? 如果這是最好的方法那么我做錯了什么?

當然!

  • 創建您自己的自定義內存中 Singleton Appender
  • 除了您將執行的所有其他日志記錄之外,修改測試記錄器配置以記錄到此附加程序
  • 在每次測試期間clear()@Begin
  • 在測試完成之前,通常對其進行斷言測試。

事實上,SLF4J 已經有一個你可以查看的實現。

關於如何設置 JUnit 來測試日志記錄語句,我想我找到了答案。 這是代碼。

package com.example.demo;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import lombok.Getter;
import org.junit.Test;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;


public class FooTest {

    @Test
    public void somethingTest() {
        Appender appender = new Appender();
        Logger logger = (Logger) LoggerFactory.getLogger(Foo.class);
        logger.addAppender(appender);
        appender.start();

        (new Foo()).something();

        assertEquals(1, appender.getEvents().size());
        assertEquals("doing foo test", appender.getEvents().get(0).getMessage());

    }

}
@Getter
class Appender extends AppenderBase<ILoggingEvent> {
    private List<ILoggingEvent> events = new ArrayList<>();

    @Override
    protected void append(ILoggingEvent iLoggingEvent) {
        events.add(iLoggingEvent);
    }
}

private Logger baseLoggerMock = (Logger) LoggerFactory.getLogger(MyService.class); private ListAppender baseListAppender = new ListAppender<>(); 私有列表 logsList = baseListAppender.list;

@BeforeEach
void setUp() {
    baseListAppender.start();
    baseLoggerMock.addAppender(baseListAppender);
}

@Test void shouldCallLoggerAndLogMessages() {

    assertEquals(
            "My Message",
            logsList.get(0).getFormattedMessage());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM