首先,我们创建一个记录器实例和一个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());
}
}