【问题标题】:How I assert my log message when the log is created by lombok当日志由 lombok 创建时,我如何断言我的日志消息
【发布时间】:2017-04-12 14:24:18
【问题描述】:

我有以下代码:

@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());
        }
    }

我想进行测试以验证日志消息。 我不知道怎么做。

谢谢

【问题讨论】:

  • 如果您需要验证日志消息,那可能是代码异味。您能否详细说明为什么需要验证日志消息?
  • @AlastorMoody 存在几个需要特定消息的用例:客户端请求正确记录此特定消息,因为某些其他工具需要它;一位项目经理说我想要 100% 的代码覆盖率,包括日志语句等。
  • 您可以创建一个包私有异常 (PPE) 来扩展您的 FeatureException 异常。此 PPE 有一个 logMessage() 方法,该方法构造您想要的消息,而无需向调用代码询问消息。此 PPE 为您提供所需的日志消息,并且在您的单元测试中,您可以检查是否引发了包私有异常。从公共调用者那里,他们仍然可以捕获 FeatureException。这能解决你的问题吗?如果可行,那么我可以将此评论转换为答案,以便您接受。如果没有,您可以在 logMessage 上使用 assertEquals。
  • @AlastorMoody 如果有人说“在这种情况下,我希望记录一个警告”,这是一个要求。像任何其他要求一样,它应该被测试。我不认为那是一种气味。
  • “在这种情况下,我希望记录一个警告”-> 这是一个公平的用例。但是 OP 说“在这种情况下,我希望使用此确切消息记录警告”-> 开发人员应该能够通过添加其他信息来调整消息字符串以使其操作更容易(如果需要)。

标签: java junit lombok


【解决方案1】:

此用例的SLF4J project recommends usingSLF4J Test

在您的情况下(也使用 Hamcrest 和 Mockito):

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()。除此之外,我认为这应该是公认的解决方案。
【解决方案2】:

如果其他解决方案不适合您,另一种选择:您可以验证 otherClass.execute() 引发的异常

A) 看到对getMessage()的调用

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

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多