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

标签 unit-testing annotations mockito slf4j lombok

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

相关文章:

angular - 在 angular2 中使用 ts-mockito 模拟 getter

unit-testing - 使用 Moq Verify() 方法调用计数时,失败测试的错误消息包含使用 Moq 的实际方法调用计数

visual-studio-2010 - Visual Studio 2010无法识别单元测试

Android:仅为测试添加单独的资源

ios - 如果我在 Swift 中选择我的位置,我该如何比较?

java - GWT RPCServlet - Junit + getThreadLocalRequest

Java:使用反射注入(inject)字段的最快方法是什么?

java - Java注解中的调用方法

java - Mockito 在 stub 时从父类(super class)调用真实方法

spring - ReflectionTestUtils 在 Spring 测试中不能与 @Autowired 一起使用