繁体   English   中英

JUnit4:以多种测试方法测试System.out

[英]JUnit4: Testing System.out in multiple test methods

我有一个应用程序,我想在其中编写单元测试以测试输出,然后将其写入System.out(甚至是System.err)。 每个单独的测试均按预期工作,但是在同一个类中添加多个测试时,某些测试将失败,因为JUnit4似乎是多线程的(因此,不能保证在确切重置流时就没有保证)。 当我将所有测试方法放在自己的类中并使用测试套件时,也会发生相同的情况。

有任何想法吗?

private static final PrintStream SYS_OUT = System.out;
private static final PrintStream SYS_ERR = System.err;

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();

@Before
public final void setUpStreams() throws UnsupportedEncodingException {
    System.setOut(new PrintStream(this.outContent, true, CHARSET));
    System.setErr(new PrintStream(this.errContent, true, CHARSET));
}

@After
public final void cleanUpStreams() {
    System.setOut(SYS_OUT);
    System.setErr(SYS_ERR);
}

@Test
public final void listServicesAndMethods() throws ServiceException, UnsupportedEncodingException {
    com.example.Main.main(new String[]{"--list-services"});
    LOG.debug(this.outContent.toString(CHARSET));
    assertTrue("String not found", this.outContent.toString(CHARSET).contains("Some string"));
    assertFalse("Other string found", this.outContent.toString(CHARSET).contains("Some other string"));
    this.outContent.reset();
    this.errContent.reset();
}

编辑:事实证明,失败的问题不是(仅仅因为?)是因为数据流,而是由于我将选项存储在主类的静态字段中。 这样的结果是,几个选项在连续测试期间保持活动状态。 我意识到,在实施了Arian的建议之后,我将第二个类用作实例,而不是调用静态方法,从而解决了我的问题。

感谢所有答复。

如果尚未这样做,请重写应用程序的各个部分以将输出作为参数,而不是直接写入System.out 无论测试如何,这通常是更好的设计。

在每个测试中,创建一个新的输出流(如果需要,还可以监视 System.out )并将其传递给被测代码单元。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM