在JUnit Test中 测试日志中输出内容

563 阅读1分钟

首先,我们创建一个记录器实例和一个ListAppender来捕获日志事件。我们将记录器配置为针对被测试的类,在本例中就是该类Service。这ListAppender允许我们将日志事件存储在列表中以供以后分析。

package service;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.time.Instant;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

class ServiceReportServiceRetryTest extends IntegrationTestBase {

    @Autowired
    private Service service;

    @Test
    void should_retry_save_inspection_service_report_index_3_times() {
        // 创建日志记录器实例和 ListAppender 以捕获日志事件
        Logger fooLogger = (Logger) LoggerFactory.getLogger(Service.class);
        ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
        listAppender.start();
        // 将 ListAppender 附加到日志记录器
        fooLogger.addAppender(listAppender);

        when(something()).thenThrow(RuntimeException.class);
        
        // 调用被测方法
        service.doSomething();


        // 从 ListAppender 提取捕获的日志事件
        List<ILoggingEvent> list = listAppender.list;
        
        // 断言
        assertEquals(4, list.size());
        list.forEach(it -> assertEquals(Level.ERROR, it.getLevel()));
        assertEquals("save error", list.get(0).getMessage());
        assertEquals("save error", list.get(1).getMessage());
        assertEquals("save error", list.get(2).getMessage());
        assertEquals("[retry fail] save error: {}, {}", list.get(3).getMessage());
    }
}