当使用lombok创建日志时,如何断言我的日志消息

9
我有以下代码:

我有以下代码:

@Component
@Slf4j
public class MyClass {

    private OtherClass otherClass;

    @Autowired
    public MyClass(OtherClass otherClass) {
        this.otherClass = otherClass;
    }

    public void start() {
        try {
            otherClass.execute();
        } catch (FeatureException exception) {
            log.warn(exception.getMessage());
        }
    }

我想进行测试以验证日志消息。

但我不知道该如何操作。

谢谢。


如果您需要验证日志消息,那可能是一种代码异味。您能详细说明为什么需要验证日志消息吗? - FirstName LastName
1
@AlastorMoody 存在几种使用情况需要特定的消息:客户请求正确记录此特定消息,因为某些其他工具期望它;项目经理说我想要100%的代码覆盖率,包括日志语句等。 - Olivier Grégoire
您可以创建一个扩展FeatureException异常的包私有异常(PPE)。此PPE具有logMessage()方法,该方法构造您想要的消息而不需要请求调用代码提供消息。这个PPE为您提供所需的日志消息,在单元测试中,您可以检查是否抛出了包私有异常。从公共调用方,他们仍然可以捕获FeatureException。这解决了您的问题吗?如果有效,那么我可以将此评论转换为答案,以便您可以接受它。如果无效,则可以对logMessage使用assertEquals。 - FirstName LastName
@AlastorMoody如果有人说“在这个条件下,我希望会记录一个警告”,那就是一个需求。像其他任何需求一样,它都应该经过测试。我认为这完全不算是什么问题。 - quiram
@AlastorMoody,在日志要求中包含明确的文本要求并不是不合理的。你不知道谁会阅读日志以及他们的需求是什么。或者他们的技术专业知识,或者他们创建更复杂解决方案的预算。这一切都取决于上下文,但是一个需要“我的日志消息必须完全符合这个要求”的要求本身并不表明任何缺陷。 - quiram
显示剩余3条评论
2个回答

6

在这种情况下(同时使用 Hamcrest 和 Mockito),SLF4J 项目建议使用 SLF4J Test 库。

public class MyClassTest {

  TestLogger logger = TestLoggerFactory.getTestLogger(MyClass.class);

  @Test
  public void testStart_loggingFailureMessage() {
    OtherClass otherClass = mock(OtherClass.class);
    MyClass myClass = new MyClass(otherClass);

    when(otherClass.execute()).thenThrow(new FeatureException("Some text"));

    myClass.start();

    assertThat(logger.getLoggingEvents(), is(asList(LoggingEvent.warn("Some text"))));
  }

  @After
  public void clearLoggers() {
    TestLoggerFactory.clear();
  }
}

TestLoggerFactory.clear() 对我来说似乎不起作用,相反我必须使用 logger.clearAll()。除此之外,我认为这应该是可以接受的解决方案。 - quiram
SLF4J Test是什么,它是Maven依赖项吗? - gene b.

0

如果其他解决方案对您不起作用,还有另一种选择:您可以验证由otherClass.execute()引发的异常

A)查看是否调用了getMessage()

B)被捕获(您可以编写一个测试,抛出运行时异常,您希望它能够命中您的测试用例;以及第二个测试,抛出FeatureException...显然不应该到达测试用例)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接