我不確定是否有可能,但如果可以,我該怎麼做?我有一個項目包含另外2個項目作爲依賴關係。父項目僅用於測試目的(客戶端服務器應用程序)。當我正在測試時,由於客戶端和服務器項目的輸出量很大,我無法通讀測試輸出。我試圖找到從控制檯隱藏我的子項目的所有輸出(printf()
)的方式,以便我只能看到我的測試輸出。有沒有辦法做到這一點?Java - 測試時隱藏系統輸出
對於測試,我使用JUnit。
感謝
我不確定是否有可能,但如果可以,我該怎麼做?我有一個項目包含另外2個項目作爲依賴關係。父項目僅用於測試目的(客戶端服務器應用程序)。當我正在測試時,由於客戶端和服務器項目的輸出量很大,我無法通讀測試輸出。我試圖找到從控制檯隱藏我的子項目的所有輸出(printf()
)的方式,以便我只能看到我的測試輸出。有沒有辦法做到這一點?Java - 測試時隱藏系統輸出
對於測試,我使用JUnit。
感謝
你應該使用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在您的測試代碼,這樣你就可以重定向你的輸出到文件,例如,那麼你忽略控制檯輸出和查看文件由您的測試生成。
它不是一個完美的解決方案,也沒有良好的編碼習慣,但你可以添加一個類這樣
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狀態碼或綠色條(IDE或jenkins)。例如您可以在例如maven日誌測試結果。只是忽略標準輸出
另一件事:在你的應用程序中使用控制檯通常是個壞主意 - 避免它。改用日誌框架(它可以讓你控制日誌的目的地和級別)。使用你的IDE和重構 - 用log.debug或用你自己的包裝器代替所有對printf的調用。如果你的IDE不支持它然後使用一些正則表達式,並嘗試替換所有
如果你想擺脫所有的輸出,你可以重定向標準輸出到/ dev/null或更改輸出流在Java中。但這不是一個合適的解決方案
感謝您的建議。正如你所說,我現在只是無視一切。只是想知道是否有可能擺脫它們。但是可能會在稍後的時間點重構我所有的'printf' – Rakim
無法遍歷所有應用程序類並開始將所有系統輸出更改爲Java記錄器。更多的情況是,有一種方法可以按原樣或按照 – Rakim
的方式進行。在應該可重用的代碼中使用System.out.print是一個不好的做法。如果沒有記錄器,沒有辦法做到你想要的東西,但看看System.setOut方法。 – andrucz
感謝您的建議! – Rakim