如何在System.err上通过单元测试?

时间:2015-06-24 16:30:33

标签: java unit-testing junit

在我需要进行单元测试的类中,有一个使用System.err.print的部分。我们如何抛出异常或传递任何@rule以便在它到达那条线时通过测试?  代码是:

if (a == null) {
            System.err.println("Error: empty file");
            System.exit(1);
        } 

由于

4 个答案:

答案 0 :(得分:1)

您可以将err重定向到引发异常的流:

OutputStream os = new OutputStream() {
  @Override public void write(int b) throws IOException {
    throw new IOException ();
  }
};
System.setErr(new PrintStream(os));

当某些代码调用System.err.println()时,您将获得IOException(您可以更改例外)。

因此,在测试中,您可以检查是否抛出了IOException

答案 1 :(得分:1)

您可能希望将该行和后续行包装在另一个类中并模拟它。当你到达时,你会遇到问题

System.exit(1)

因为这将迫使JVM退出并且您的测试不会通过。

查看this现有问题以寻求帮助。

答案 2 :(得分:0)

使用方法sytemExit(int code)创建一个类 SystemExitter 。调用该方法而不是直接调用System.exit(...),这样就可以通过模拟SystemExitter(使用PowerMock,EasyMock,Mockito,...)来测试代码。

虽然您永远无法测试SystemExitter的方法sytemExit(...),但它只是一行代码。

答案 3 :(得分:-1)

您可以使用System#setErr暂时替换System.err作为测试方法的正文。它可以是一个模拟器,因此您可以强制执行您喜欢的任何行为,也可以在其中累积类输出以进行后续验证。

确保在测试方法结束之前将原始流放回,以免影响其他测试或测试框架本身。