2015-10-10 81 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); 
    } 
}