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()(以及inerr )设置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?