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

關於在 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 來斷言控制檯輸出的測試方法就是 閱讀全文 >>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章