Java 如何验证单元测试记录的错误

Java 如何验证单元测试记录的错误,java,unit-testing,logging,junit,mockito,Java,Unit Testing,Logging,Junit,Mockito,假设我有这样一节课: 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; } /

假设我有这样一节课:

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
  }
}
@Test
public void testTerribleCase() throws ModuleException {
  myMethod("terrible"); 
  //Log should contain "This is terrible!" or assert that error was logged
}
MyClass
的单元测试如下所示:

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
  }
}
@Test
public void testTerribleCase() throws ModuleException {
  myMethod("terrible"); 
  //Log should contain "This is terrible!" or assert that error was logged
}

是否有某种方法可以确定日志包含特定字符串“This Is terrable”?或者更好的是,有没有一种方法可以确定它是否记录了错误,而无需查找特定的字符串值

创建一个自定义筛选器以查找消息,并记录是否曾经看到过该消息

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

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