首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mockito Unit test lombok.extern.slf4j @Slf4j注解日志?

Mockito Unit test lombok.extern.slf4j @Slf4j注解日志?
EN

Stack Overflow用户
提问于 2020-04-02 01:29:17
回答 2查看 3.9K关注 0票数 1

我有一个方法,它在内部调用一个名为"burn“的方法,该方法抛出一个数据异常,如果是这样的话,它将被一个try/catch块捕获并记录到一个记录器中。然而,该类使用的是注释@Slf4j和lombok.extern.slf4j:

代码语言:javascript
运行
复制
@Slf4j
public class MyClass {

 private void myMethod(Type parameter) throws Exception {
     try {
        dataGateway.burn(id);
         }
     catch {
        log.error("Failed to burn({})",id);
        }
  }

我已经模拟了数据网关,并让它在调用burn时抛出异常,我知道异常被捕获了,但是我如何使用verify来断言记录器是通过.error调用的?DateGateway dBMock = mock(DateGateway.class);

代码语言:javascript
运行
复制
when(dBMock.burn(anyString())).thenReturn(new DataException("exception"));
EN

回答 2

Stack Overflow用户

发布于 2020-10-19 21:09:18

我在这里找到了一个很好的解决方案:https://www.jvt.me/posts/2019/09/22/testing-slf4j-logs/

解决方案是将日志附加器添加到要测试的类中,然后从该附加器读取已记录的内容。

下面是为特定类添加和返回附加器的通用方法:

代码语言:javascript
运行
复制
private ListAppender<ILoggingEvent> getListAppenderForClass(Class clazz) {
    Logger logger = (Logger) LoggerFactory.getLogger(clazz);
    ListAppender<ILoggingEvent> loggingEventListAppender = new ListAppender<>();
    loggingEventListAppender.start();
    logger.addAppender(loggingEventListAppender);
    return loggingEventListAppender;
}

在您的示例中,您可以在测试中使用此附加器来验证是否调用了特定的日志行:

代码语言:javascript
运行
复制
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"));
票数 2
EN

Stack Overflow用户

发布于 2021-07-31 07:48:36

你可以试试库:https://www.simplify4u.org/slf4j-mock/

它还与lombok注解一起使用。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60976827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档