在我需要进行单元测试的类中,有一个使用System.err.print的部分。我们如何抛出异常或传递任何@rule以便在它到达那条线时通过测试? 代码是:
if (a == null) {
System.err.println("Error: empty file");
System.exit(1);
}
由于
答案 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)
答案 2 :(得分:0)
使用方法sytemExit(int code)创建一个类 SystemExitter 。调用该方法而不是直接调用System.exit(...),这样就可以通过模拟SystemExitter(使用PowerMock,EasyMock,Mockito,...)来测试代码。
虽然您永远无法测试SystemExitter的方法sytemExit(...),但它只是一行代码。
答案 3 :(得分:-1)
您可以使用System#setErr
暂时替换System.err
作为测试方法的正文。它可以是一个模拟器,因此您可以强制执行您喜欢的任何行为,也可以在其中累积类输出以进行后续验证。
确保在测试方法结束之前将原始流放回,以免影响其他测试或测试框架本身。