当前位置: 首页 > 知识库问答 >
问题:

使用@Slf4j注释创建时如何模拟记录仪?

唐星晖
2023-03-14

我有一个具有@Slf4j注释的类。

我试着写一个测试和模拟记录仪,但它不起作用。

@RequiredArgsConstructor
@Slf4j
public abstract class ExampleClass {
    
    protected final PropsClass properties;
    
    protected void logInfo(..) {
        log.info(...);
        clearMappedDiagnosticContext();
    }
}

测试是这样的:

@RunWith(MockitoJUnitRunner.class)
public class ExampleClassTest {
    
    @Mock
    Logger logger;
    
    @Mock
    PropsClass properties;
    
    @InjectMocks
    ExampleClass exampleClass;
    
    @Test
    public void logSomethingtest() {
        ...
        exampleClass.logInfo(...);
        Mockito.verify(logger).info(marker, "foo bar {}", ...);
    }

这是我得到的错误:

Wanted but not invoked:
logger.info(
    MY_MARKER,
    "..........",
    "....",
    "....",
    0L
);

Actually, there were zero interactions with this mock.

问题是,如何嘲笑伐木工?

共有2个答案

昝卓
2023-03-14

您可以使用 https://www.simplify4u.org/slf4j-mock/ 库。

您的示例代码可以工作-您只需要依赖slf4j模拟,而不需要其他slf4jbinding。

罗伟兆
2023-03-14

lombok@Slf4j注释在编译时将代码注入到类中。具体来说,它将向类中添加以下代码:

private static final org.slf4j.Logger log =
                        org.slf4j.LoggerFactory.getLogger(LogExample.class);

@InjectMocks告诉 Mockito 创建类的实例,并在运行时注入模拟作为其依赖项。

记录器在编译时注入。依赖项在运行时注入。这就是为什么您的记录器没有被模仿,也不能像这样被模仿。如果您查看上面注入的记录器代码,就会明白,模拟记录器的唯一方法是模拟LoggerFactory(Mockito可以模拟自3.4版IIRC以来的静态方法)并使其返回记录器模拟。

注意:制作模拟返回模拟通常是一个坏主意,应该避免。< code>@Slf4j太方便了,不能不用。这是一种权衡。

注:如果你想让记录器静音,那么你也可以将其配置为在测试中关闭。

 类似资料:
  • 我想创建自己的自定义注释,我使用的是Spring框架。 当有人注释他的POJO类时,后面的代码将触发方法。 例如@Sensetive(values=“accountNumber”)在下面的类上注释时 将调用一个方法,在记录值时,这些值将被屏蔽(例如accountNumber=“12345”- 我知道@ToString注释可以在调用toString方法时完全排除值,但是否有可能屏蔽它?

  • 我试图用< code > swagger-maven-plugin 来记录我的api。 当我用< code>@Parameter注释路由参数时,只要没有用< code>@BeanParam注释,就会在openapi生成的文件中很好地记录下来。 如招摇岩心文件所述, @Parameter可以代替或与JAX-RS参数注释(@PathParam、@QueryParam、@HeaderParam、@@Fo

  • 我有一个间接使用类Foo的测试用例。对于测试用例,我不在乎Foo是什么。我应该可以嘲笑它。 然而,testcase使用一个库来调用Foo上的一些方法。其中一些方法返回对象,然后该库对这些返回的对象调用一些方法。就本测试而言,这些对象是什么并不重要,只是它们不是null,并且不会导致NullPointerException。 对于该库调用的每个对象和方法,我已经经历并添加了一系列类似以下的expec

  • 问题内容: 我试图用来向没有定义主键的表中插入数据。 但是事实是该表的两个字段一起在表中是唯一的。我如何使用hibernate注释实现相同的目的? 这是我的代码。 问题答案: 您可以使用和创建复合键,并将其与您的实体进行映射。例如: 然后在Java代码中使用常规方式来持久化实体。 参考:http : //docs.jboss.org/hibernate/annotations/3.5/refere

  • 问题内容: 我正在尝试做一些Java注释魔术。我必须说,我仍在追赶注释技巧,并且某些事情对我来说还不太清楚。 所以…我有一些带注释的类,方法和字段。我有一个方法,它使用反射对类进行一些检查并将一些值注入到类中。这一切都很好。 但是,我现在面临的情况是我需要一个注释实例(可以这么说)。所以…批注与常规接口不同,您不能对类进行匿名实现。我知道了。我在这里浏览了有关类似问题的一些帖子,但似乎无法找到所需

  • 我想在Java中生成一个XFDF Stamp注释,它的内部会有一个透明的图像。我很难识别图像存储的格式以及如何将输入图像转换为该格式。 到目前为止我知道 null 我有一个包含图像的XFDF示例,当我解码图像时,我看到了如下语法,但遗憾的是,我不知道 标记中存在什么样的原始数据。 我已经设法在PDFBox的帮助下在PDF中创建了一个带有自定义图像的橡皮图章注释,但遗憾的是PDFBox似乎不支持将这