2015-12-07 139 views
2

我不確定是否有可能,但如果可以,我該怎麼做?我有一個項目包含另外2個項目作爲依賴關係。父項目僅用於測試目的(客戶端服務器應用程序)。當我正在測試時,由於客戶端和服務器項目的輸出量很大,我無法通讀測試輸出。我試圖找到從控制檯隱藏我的子項目的所有輸出(printf())的方式,以便我只能看到我的測試輸出。有沒有辦法做到這一點?Java - 測試時隱藏系統輸出

對於測試,我使用JUnit。

感謝

回答

2

你應該使用Java API記錄器(或Log4J的),而不是直接使用System.out.print,SOU你可以在你的測試執行過程中禁用特定的記錄器。

如果你不能改變舊代碼使用記錄器API,有兩種選擇:

選項1:

創建一個PrintStream裝飾類這樣的僞代碼:

public class FilteredPrintStream extends PrintStream { 

    private final PrintStream stream; 

    ... 

    @Override 
    public void print(String str) { 
     if (notCalledBySubproject()) { 
      stream.print(str); 
     } 
    } 

    // override other methods too 
} 

然後,設置默認輸出:System.setOut(new FilteredPrintStream(System.out));

要找到方法調用者(以CREA TE notCalledBySubproject方法),見How do I find the caller of a method using stacktrace or reflection?

選項2:

使用記錄器API在您的測試代碼,這樣你就可以重定向你的輸出到文件,例如,那麼你忽略控制檯輸出和查看文件由您的測試生成。

+0

無法遍歷所有應用程序類並開始將所有系統輸出更改爲Java記錄器。更多的情況是,有一種方法可以按原樣或按照 – Rakim

+0

的方式進行。在應該可重用的代碼中使用System.out.print是一個不好的做法。如果沒有記錄器,沒有辦法做到你想要的東西,但看看System.setOut方法。 – andrucz

+0

感謝您的建議! – Rakim

0

它不是一個完美的解決方案,也沒有良好的編碼習慣,但你可以添加一個類這樣

public class SystemOutput 
{ 
    public static final boolean DO_PRINT = true; 

    public void printf(String format, Object... args) 
    { 
    if(DO_PRINT) 
     System.printf(format, args); 
    } 
} 

,並使用查找和替換更換一次「System.out.printf」與「SystemOutput.printf」在每個班級都需要。因爲這兩種方法都具有相同的聲明,所以只能對其進行更改。當您想要阻止輸出時,您可以將DO_PRINT設置爲false

Eclipse例如提供了一個搜索工具,它可以在項目中的每個.java文件中查找和替換某個字符串。 (文件搜索選項卡下STRG + H)

當然

,也可以調用System.setOut()用自己的PrintStream子類,它覆蓋printf()方法僅打印時一定布爾值是true

+0

感謝您的建議,但使用開關的系統輸出方式太多了。特別是當他們只需要爲了測試目的而隱藏時。如果我正要經歷如此多的重構代碼,我可以直接使用Logger,因爲@andrucz建議 – Rakim

+0

增加了另一種可能性,這是兩種解決方案之間的混合 – Tobias

0

爲什麼你需要控制檯來運行單元測試?忽略它。如果你的測試通過,你有0狀態碼或綠色條(IDE或jenkins)。例如您可以在例如maven日誌測試結果。只是忽略標準輸出

另一件事:在你的應用程序中使用控制檯通常是個壞主意 - 避免它。改用日誌框架(它可以讓你控制日誌的目的地和級別)。使用你的IDE和重構 - 用log.debug或用你自己的包裝器代替所有對printf的調用。如果你的IDE不支持它然後使用一些正則表達式,並嘗試替換所有

如果你想擺脫所有的輸出,你可以重定向標準輸出到/ dev/null或更改輸出流在Java中。但這不是一個合適的解決方案

+0

感謝您的建議。正如你所說,我現在只是無視一切。只是想知道是否有可能擺脫它們。但是可能會在稍後的時間點重構我所有的'printf' – Rakim