System.out.println()的JUnit测试

我需要为一个设计拙劣的旧应用程序编写JUnit测试,该应用程序正在向标准输出写入大量错误消息。当getResponse(字符串请求)方法行为正确时,它将返回一个XML响应:

@BeforeClass
公共静态void setUpClass()引发异常{
Properties queries=loadPropertiesFile(“requests.Properties”);
Properties responses=loadPropertiesFile(“responses.Properties”);
实例=新的响应生成器(查询、响应);
}
@试验
public void testGetResponse(){
String request=“<some>request</some>”;
字符串expResult=“<某些>响应</some>”;
字符串结果=instance.getResponse(请求);
assertEquals(expResult,result);
}

但当它得到格式错误的XML或不理解请求时,它返回null,并将一些内容写入标准输出

有没有办法在JUnit中断言控制台输出?要抓住以下情况:

System.out.println(“找到匹配项:+strExpr”);
System.out.println(“xml格式不正确:+e.getMessage());

使用ByteArrayOutputStream和System.setXXX很简单:

private final ByteArrayOutputStream outContent=new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent=new ByteArrayOutputStream();
私有最终打印流originalOut=System.out;
私有最终打印流originalErr=System.err;
@以前
公共数据流(){
系统放样(新打印流(输出内容));
System.setErr(新打印流(errContent));
}
@之后
公共无效恢复团队(){
系统放样(原始);
系统设置错误(originalErr);
}

样本测试用例:

@测试
公开作废{
System.out.print(“hello”);
assertEquals(“hello”,outContent.toString());
}
@试验
公共无效错误(){
System.err.print(“再次你好”);
assertEquals(“再次您好”,errContent.toString());
}

我使用这段代码测试命令行选项(断言-version输出版本字符串,等等)

编辑:
此答案的先前版本在测试后称为System.settout(null);这就是评论员提到的NullPointerException的原因

发表评论