【问题标题】:How to verify that error was logged with unit tests如何验证单元测试是否记录了错误
【发布时间】:2015-10-10 03:20:12
【问题描述】:

假设我有以下这样的课程:

public class MyClass {
  public static final Logger LOG = Logger.getLogger(MyClass.class);

  public void myMethod(String condition) {
    if (condition.equals("terrible")) {
      LOG.error("This is terrible!");
      return; 
    }
    //rest of logic in method
  }
}

MyClass 的单元测试如下所示:

@Test
public void testTerribleCase() throws ModuleException {
  myMethod("terrible"); 
  //Log should contain "This is terrible!" or assert that error was logged
}

有什么方法可以确定日志中是否包含特定的字符串“这太可怕了”?或者更好的是,有没有一种方法可以在不查找特定字符串值的情况下确定它是否记录了错误?

【问题讨论】:

  • 通常您会模拟日志,但根据您的日志库,您可能甚至无法做到
  • 是否有充分的理由说明您为什么需要测试是否退出?唯一一次我觉得测试你的日志记录是件好事是当你注销到一个关键文件时。
  • 我想测试是否发生了日志,因为我想确保如果条件为真,该方法的其余部分不会执行(我有一个 return; 日志后面的语句,这意味着它应该跳过该方法的其余部分)。
  • 最好直接验证“方法中的其余逻辑”中的内容是否没有与之交互。

标签: java unit-testing logging junit mockito


【解决方案1】:

创建一个自定义过滤器来查找消息并记录它是否曾被看到。

@Test
public void testTerribleCase() throws ModuleException {
    class TerribleFilter implements Filter {
        boolean seen;
        @Override
        public boolean isLoggable(LogRecord record) {
            if ("This is terrible!".equals(record.getMessage())) {
                seen = true;
            }
            return true;
        }
    }

    Logger log = Logger.getLogger(MyClass.class.getName());
    TerribleFilter tf = new TerribleFilter();
    log.setFilter(tf);
    try {
        myMethod("terrible");
        assertTrue(tf.seen);
    } finally {
        log.setFilter(null);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多