我有一个方法在内部调用一个名为“burn”的方法,该方法会抛出数据异常,如果是这样,它就会被 try/catch block 捕获并记录到记录器中。然而,该类正在使用注释 @Slf4j 和 lombok.extern.slf4j:
@Slf4j
public class MyClass {
private void myMethod(Type parameter) throws Exception {
try {
dataGateway.burn(id);
}
catch {
log.error("Failed to burn({})",id);
}
}
我已经模拟了数据网关并让它在调用 burn 时抛出异常,我知道异常被捕获但是我如何使用验证来断言记录器是用 .error 调用的? DateGateway dBMock = mock(DateGateway.class);
when(dBMock.burn(anyString())).thenReturn(new DataException("exception"));
最佳答案
我在这里找到了解决这个问题的好方法:https://www.jvt.me/posts/2019/09/22/testing-slf4j-logs/
解决方案是向要测试的类添加一个日志附加程序,然后只读取从该附加程序记录的内容。
这是一个为特定类添加和返回附加程序的通用方法:
private ListAppender<ILoggingEvent> getListAppenderForClass(Class clazz) {
Logger logger = (Logger) LoggerFactory.getLogger(clazz);
ListAppender<ILoggingEvent> loggingEventListAppender = new ListAppender<>();
loggingEventListAppender.start();
logger.addAppender(loggingEventListAppender);
return loggingEventListAppender;
}
在您的情况下,您可以在测试中像这样使用此 appender 来验证是否调用了您的特定日志行:
final ListAppender<ILoggingEvent> listAppenderForClass = getListAppenderForClass(CardApi.class);
org.assertj.core.api.Assertions.assertThat(listAppenderForClass.list)
.extracting(ILoggingEvent::getFormattedMessage)
.anyMatch((Predicate<String>) s -> s.startsWith("Failed to burn"));
关于unit-testing - Mockito 单元测试 lombok.extern.slf4j @Slf4j 注释日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60976827/