gpt4 book ai didi

unit-testing - Mockito 单元测试 lombok.extern.slf4j @Slf4j 注释日志?

转载 作者:行者123 更新时间:2023-12-05 02:08:24 38 4
gpt4 key购买 nike

我有一个方法在内部调用一个名为“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/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com