2015-10-10 60 views
0

比方说,我有下面的类是这样的:如何验证错误与单元测试记录

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 
} 

有一些确定日志包含特定字符串“这太可怕了”的方法?或者甚至更好,有没有一种方法来确定它是否记录了一个错误而不查找特定的字符串值?

+0

一般来说,你会模拟日志,但取决于你的日志库你可能甚至不能*这*。 – Makoto

+1

[如何在记录器中对消息进行junit声明]可能的重复(http://stackoverflow.com/questions/1827677/how-to-do-a-junit-assert-on-a-message-in -a-logger) – Joe

+1

是否有很好的理由为什么你需要测试这是注销?我唯一一次觉得测试你的日志记录是好的,当时你正在注销一个关键文件。 – Makoto

回答

2

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

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