如何在maven surefire单元测试中读取控制台输出

时间:2018-10-29 09:16:13

标签: java maven junit maven-surefire-plugin system.out

我正在尝试测试一种方法,该方法必须将特定的字符串打印到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)

1 个答案:

答案 0 :(得分:0)

我通过将System.out.println()更改为使用log4j进行记录来解决此问题。

Raedwalds comment and link7之后,我决定放弃旧的系统输出。但是我没有使用PrintStream,而是更进一步,将代码重构为使用Log4j日志记录。

然后我用this answer从单元测试中读取输出的日志。