Java 單元測試如何斷言(檢查)控制臺輸出
阿新 • • 發佈:2018-06-02
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 單元測試如何斷言(檢查)控制臺輸出