簡體   English   中英

如何在 maven surefire 單元測試中讀取控制台輸出

[英]How to read console output in maven surefire unit test

我正在嘗試測試一種必須將特定字符串打印到 System.out 的方法。

我已經使用這個答案來讓它與 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)

我通過將System.out.println()更改為使用 log4j 進行日志記錄來解決此問題。

根據Raedwalds 評論和 link7,我決定丟棄舊的系統輸出。 但是我沒有使用 PrintStreams,而是更進一步,重構了代碼以使用 Log4j 日志記錄。

然后我使用這個答案從單元測試中讀取輸出的日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM