2012-09-28 77 views
0

最初的標題是:如何讓Apache LogFactory始終返回相同的日誌實現?在單元測試期間,如何將所有輸出記錄到控制檯而不是日誌文件

我有一個使用相當配置爲去不同的地方几個不同的記錄器的項目。當我運行單元測試時,我想用我實例化自己的SimpleLogger來覆蓋它們。我如何將它設置爲LogFactory,以便它總是返回進行單元測試?

我真的寧願不處理外部配置文件。

作爲背景的一點點,我覺得記錄儀notorously不可信的。它確實不是真正的記錄器,它有很多方法來配置它並過濾輸出 - 可以從各種配置文件或代碼中的任何位置完成,然後它可以發送到各種位置。記錄器甚至可以根據配置將某種輸出(錯誤)發送到其他位置。

雖然這可以說是相當真棒和強大,這一切都撤消,當你花費60小時要琢磨爲什麼它實際上是被稱爲當不叫你的代碼,但你的輸出被重定向。

在運行測試中,我想確信無疑可能是我看到所有的輸出,所以我想將所有日誌重定向到控制檯。 (所有,在我目前的項目可以創建跨6個目錄流傳幾打不同的日誌文件。)

回答

1

我終於想出了一個辦法做到這一點。

您可以用您自己的工廠擴展的LogFactory - 既覆蓋getInstance方法來回報您的記錄器(顯然是所有其他的方法可以爲空)。我用SimpleLogger到divirt所有登錄到控制檯:

 
public Log getInstance(String name) throws LogConfigurationException { 
    // If this weren't just for testing I'd keep a map of these loggers instead... 
    SimpleLog consoleLogger=new SimpleLog(name); 
    consoleLogger.setLevel(SimpleLog.LOG_LEVEL_ALL); 
    return consoleLogger; 
} 
public Log getInstance(Class className) throws LogConfigurationException { 
    return getInstance(arg0.getName()); 
} 

然後用這個類中的靜態方法來安裝它:

 
public static void initialize() { 
    System.setProperty(LogFactory.FACTORY_PROPERTY, MyLogFactory.class.getName()); 
} 

這個地限制整個日誌重新路由到一個類,如果你在測試開始時調用initialize(),會話的所有日誌輸出都會重新路由到控制檯。不要稍後調用它,或者您正在測試的代碼可能已經調用了「Normal」工廠並緩存了真實的記錄器。

相關問題