【问题标题】:Mockito Unit test lombok.extern.slf4j @Slf4j annotation log?Mockito 单元测试 lombok.extern.slf4j @Slf4j 注释日志?
【发布时间】:2020-04-01 17:29:16
【问题描述】:

我有一个方法调用内部称为“burn”的方法,该方法引发数据异常,如果是这样,则将其捕获在 try/catch 块中并记录到记录器。然而,该类使用注解 @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"));

【问题讨论】:

    标签: unit-testing annotations mockito slf4j lombok


    【解决方案1】:

    我在这里找到了一个很好的解决方案: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;
    }
    

    在您的情况下,您可以在测试中像这样使用这个附加程序来验证您的特定日志行是否被调用:

    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"));
    

    【讨论】:

    • 你的解决方案不能应用于Lombok @Slf4j,提供的Logger没有提供addAppender方法。
    • @spekdrum:这很奇怪。我正在使用 Lombok 1.18.12 中的 Slf4j 注释运行上面的确切代码。
    • @Fredik 我正在使用 Lombok 1.18.16。 Slf4 1.7.30 中的 LoggerFactory 和 Logger。
    • 这种方法在我使用 Lombok 1.18.16 时确实有效。
    • @spekdrum:你应该使用来自 ch.qos.logback.classic.Logger 的 Logger 类,而不是来自 sl4j 的类
    【解决方案2】:

    你可以试试图书馆:https://www.simplify4u.org/slf4j-mock/

    它也适用于lombok 注释。

    使用slf4j-mock,您不需要特殊的代码来准备记录器模拟。

    【讨论】:

    • 非常易于使用,我很欣赏涵盖许多用例的文档并立即测试了我的日志。
    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2013-03-22
    • 2010-11-13
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多