我正在编写一个测试,我想捕获测试方法在 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
此附加程序打印其消息:org.apache.log4j.ConsoleAppender
. 此附加程序没有应用特殊配置。
我错过了什么?
PS:这个SO 答案很有趣,但它对我不起作用,因为ConsoleAppender
它已经在StandardOutputStreamLog 规则可以起作用之前创建。
Java 6
Junit 4.10