System.out.println()的JUnit测试
我需要为一个设计不好的旧应用程序编写JUnit测试,并且会向标准输出写入大量错误消息。 当getResponse(String request)
方法行为正确时,它返回一个XML响应:
@BeforeClass
public static void setUpClass() throws Exception {
Properties queries = loadPropertiesFile("requests.properties");
Properties responses = loadPropertiesFile("responses.properties");
instance = new ResponseGenerator(queries, responses);
}
@Test
public void testGetResponse() {
String request = "<some>request</some>";
String expResult = "<some>response</some>";
String result = instance.getResponse(request);
assertEquals(expResult, result);
}
但是当它变得格式不正确的XML或不理解请求时,它将返回null
并将一些内容写入标准输出。
有没有办法在JUnit中声明控制台输出? 要捕捉如下情况:
System.out.println("match found: " + strExpr);
System.out.println("xml not well formed: " + e.getMessage());
使用ByteArrayOutputStream和System.setXXX很简单:
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
@Before
public void setUpStreams() {
System.setOut(new PrintStream(outContent));
System.setErr(new PrintStream(errContent));
}
@After
public void restoreStreams() {
System.setOut(System.out);
System.setErr(System.err);
}
样本测试用例:
@Test
public void out() {
System.out.print("hello");
assertEquals("hello", outContent.toString());
}
@Test
public void err() {
System.err.print("hello again");
assertEquals("hello again", errContent.toString());
}
我使用这段代码来测试命令行选项(声明-version输出版本字符串等)
编辑:在测试之后,此答案的以前版本称为System.setOut(null)
; 这是NullPointerExceptions评论者引用的原因。
我知道这是一个旧线程,但有一个很好的库来做到这一点:
系统规则
来自文档的示例:
public void MyTest {
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();
@Test
public void overrideProperty() {
System.out.print("hello world");
assertEquals("hello world", systemOutRule.getLog());
}
}
它还将允许您捕获System.exit(-1)
以及命令行工具需要测试的其他内容。
您可以通过setOut()(以及in
和err
)设置System.out打印流。 你可以重定向到一个打印流,记录到一个字符串,然后检查? 这似乎是最简单的机制。
(我会主张在某个阶段将应用程序转换为一些日志框架 - 但我怀疑你已经意识到这一点!)
链接地址: http://www.djcxy.com/p/86083.html上一篇: JUnit test for System.out.println()
下一篇: How do I configure JUnit Ant task to only produce output on failures?