我正在尝试测试一种方法,该方法必须将特定的字符串打印到System.out。
我已经使用this answer使其与JUnit一起使用。
这在JUnit上可以正常工作,但是测试由Maven surefire在CI环境中运行。然后测试失败,可能是因为Maven捕获了System.out,并且无法用于测试?
有人可以帮助我找到一种方法来使用此Surefire测试中的控制台输出吗?
这是我的考试:
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
private final PrintStream originalErr = System.err;
@Before
public void setUpStreams() {
System.setOut(new PrintStream(outContent));
System.setErr(new PrintStream(errContent));
}
@After
public void restoreStreams() {
System.setOut(originalOut);
System.setErr(originalErr);
}
@Test
public void testUpdateData() throws Exception {
MyData data = new MyData();
DataUtil.updateData(data);
Assert.assertTrue(outContent.toString().contains("is updating data within last 24h")); // assert that warning issued
}
经过测试的课程:
public final class DataUtil {
public static void updateData(Data d) {
/// do stuff
if (/*condition*/) {
System.out.println("data " + d.id + "is updating data within last 24h");
}
}
}
经过Maven测试的输出:
testUpdateData Time elapsed: 0.035 sec <<< FAILURE!
java.lang.AssertionError: null
at org.junit.Assert.fail(Assert.java:86)
at org.junit.Assert.assertTrue(Assert.java:41)
at org.junit.Assert.assertTrue(Assert.java:52)
答案 0 :(得分:0)
我通过将System.out.println()
更改为使用log4j进行记录来解决此问题。
在Raedwalds comment and link7之后,我决定放弃旧的系统输出。但是我没有使用PrintStream,而是更进一步,将代码重构为使用Log4j日志记录。
然后我用this answer从单元测试中读取输出的日志。