我正在寫一個測試,我想捕獲測試方法發送的STDOUT消息。這裏是我的代碼:如何保存輸出Log4j在JUnit測試中發送到STDOUT?
@Test
public void testAction() throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException,
CmdLineException, IOException {
PrintStream originalSTDOUT = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
try {
System.setOut(ps);
// Call to the method that will print text to STDOUT...
ps.flush();
String batchLog = baos.toString("UTF-8");
assertTrue("Invalid exception text !", batchLog.contains("my expected text..."));
} finally {
System.setOut(originalSTDOUT);//Restore original STDOUT
originalSTDOUT.write(baos.toByteArray());// Write back to STDOUT, even if I comment this line, outputs go to STDOUT...
ps.close();
}
}
不幸的是,batchLog
總是空的,雖然我仍然可以讀取預期的文本到stdout。
將文本打印到STDOUT的方法實際上會捕獲異常。然後將它傳遞到Logger
,如下所示:
log.warn(「發生錯誤:」,e);
其中e
是我在我的測試中調用的方法中引發的異常。
Logger
使用此appender打印其信息:org.apache.log4j.ConsoleAppender
。沒有特別的配置適用於這個appender。
我錯過了什麼?
P.S: 這SO answer是有趣的,但因爲ConsoleAppender
已經創建之前StandardOutputStreamLog rule可以充當它不會爲我工作。
的Java 6
Junit的4.10
該方法如何打印文本? 'System.setOut'只改變'System.out'字段的值;它可能會使用字段的緩存值或使用其他一些寫入標準輸出的方式。 – Joni
代碼工作正常,作爲獨立的主要方法。檢查你的JUnit設置和拆卸方法。問題在別的地方。 –
無法用正常的System.out.println(...)重現此操作,如何將文本打印到標準輸出? – d0x