2011-05-28 32 views
2

我有一個我想測試的錯誤條件。我想驗證的行爲是將錯誤消息寫入日誌。由於Mockito不能存儲靜態方法,所以這很困難,因爲我希望我的待測類可以直接寫入System.err.println()或我的靜態Log.error()方法。我不想爲模擬的「記錄器對象」注入每個可能寫入錯誤消息的對象!如何使用Mockito來驗證是否記錄了錯誤消息?

所以我想我問的是,你認爲什麼是構建我的Log類和/或測試類的最好方法,這樣我就可以將日誌記錄方法剔除或將它們替換爲嘲笑記錄員?

最好的答案可能不會使用Mockito,它可能是任何東西。我寧願不導入像PowerMock這樣的另一個庫,但如果你有一個好的答案需要類似的東西,我不會介意看到它。

回答

2

如果你想保持你的錄入邏輯在靜態方法,你仍然可以初始化上課的時候是基於一些系統屬性加載實時日誌實現:

class Log { 

    private static MyLogger logger; 

    static { 
    String className = System.getProperty("my.static.logger.class.name"); 
    // Instantiate your logger here... 
    // By default use some DefaultLogger implementation... 
    } 

    public static void error(String message, Throwable t) { 
    logger.error(message, t); 
    } 

} 

然後,當你運行你的測試,你可以指定一個使用-D屬性的模擬類名。但是你將需要實現你的模擬日誌記錄類而不用mockito魔術。

+0

對,我試圖想辦法注入日誌依賴。這種方式不是一半壞,因爲如果需要的話,它可以在命令行中指定。但正如你所說,通過反射實例化也意味着我不能注入Mockito模擬。 – 2011-05-29 14:51:04

+0

我想如果我想在運行時注入一個模擬,我需要一個'Log.setLogger()'方法。我無法真正想到一個更好的方法來做到這一點。我必須公開該方法,因爲我的測試不會與'Log'類相同。咩。 – 2011-05-29 15:04:45