有没有办法禁用org.junit.runner.JUnitCore的stdout输出?

时间:2016-12-21 11:35:19

标签: java bash unit-testing junit junit4

我想使用JUnit 4's JUnitCore通过脚本运行一些单元测试。 脚本很简单:

java -cp "bin:lib/*" org.junit.runner.JUnitCore my.Tests

“问题”是我想处理我的测试的输出(写入stdout和stderr),并且跑步者本身将输出添加到stdout(在每次测试后像一个“。”(点))。

有没有办法阻止跑步者的输出(即安静的JUnitCore的默认输出)?过滤这些点有点烦人。

3 个答案:

答案 0 :(得分:1)

查看JUnitCore,您可以编写自己的主包装,它只使用另一个JUnitSystem并从runMain调用JUnitCore,例如:

Result result = new JUnitCore().runMain(new NoopPrintStreamSystem(), args);
System.exit(result.wasSuccessful() ? 0 : 1);

然后,您可以根据自己的需要实施NoopPrintStreamSystem,例如PrintStream无所事事。

答案 1 :(得分:1)

除了罗兰的回答,我还会提供我的意见。首先 - 我认为您不应该在代码中使用System.out / System.err,即使在单元测试中也是如此。我将提出两个主要原因(与测试更相关):

  • 性能(正确插入和设置的日志记录系统将使单元测试运行得更快)

  • 处理的不灵活性 - 您可以设置日志记录系统以将输出流式传输到文件或其他内容中,然后再进行处理。在CI中,您可以创建日志系统(绑定)的No-Op实现,它可能是运行它们的最快方法。关键是你可以决定。

例如,你可以在测试中使用slf4j system- use api模块(只有logger类的接口)和2个相关的绑定:

  • 简单绑定(重定向到文件)
  • 无操作绑定 - 不打印任何内容

在生产代码中,您可以使用真实绑定到您选择的真实日志系统。

现在,如果您绝对需要将System.outSystem.err重定向到另一个地方(例如文件),则有一种旧技术:

System.setOut(new PrintStream(new WhatEverOutputStreamYouWant()));
System.setErr(__Just__the__same__as__above__)

您可以编写一些将为每个TestCase调用的JUnit规则,您将被设置。

答案 2 :(得分:-1)

简单如:

addListener(new MyTextListener(System.out));

覆盖TextListener.testStarted方法:

private class MyTextListener extends TextListener {

    public MyTextListener(PrintStream writer) {
        super(writer);
    }

    @Override
    public void testStarted(Description description) {

    }
}