[英]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.