1. 程式人生 > >Java 單元測試如何斷言(檢查)控制臺輸出

Java 單元測試如何斷言(檢查)控制臺輸出

UnitTest

關於在 JUnit 單元測試中如何斷言某個函數的控制臺輸出已是我一個長久的問題. 雖然有控制臺輸出的函數有了副作用, 不能稱之為一個純函數, 在講求函數式編程的今天, 純函數是最好測試的, 所謂的 Data In, Data Out. 但總還是有這樣的需求, 比如自己實現的某個日誌框架的 Appender, 需要驗證它向控制臺的輸出內容.

我先前在項目中的辦法是, 先把把標準輸出定向到一個 ByteArrayOutputStream 中去, 完後把這個流轉成字符串來斷言它的內容, 最後恢復標準輸出為 System.out, 代碼如下:

ByteArrayOutputStream output = new ByteArrayOutputStream();

System.setOut(new PrintStream(output));

System.out.print("Hello");

assertThat(output.toString(), is("Hello");
System.setOut(System.out);

這樣也能完成任務, 本質也是對的, 但稍顯復雜了些. 今天讀 Spring in Action 一書, 發現它用了 StandardOutputStreamLog 這個 JUnit 的 @Rule, 來自於 System Rules. 其實 StandardOutputStreamLog 類已不推薦使用, 取而代之的是 SystemOutRule, 所以應用 SystemOutRule

來斷言控制臺輸出的測試方法就是 閱讀全文 >>


Java 單元測試如何斷言(檢查)控制臺輸出