Java 如何通过System.err上的单元测试?
在我需要对其进行单元测试的类中,有一个部分使用System.err.print。当测试到达该行时,我们如何抛出异常或通过任何@rule来通过测试? 要编写代码,请执行以下操作:Java 如何通过System.err上的单元测试?,java,unit-testing,junit,Java,Unit Testing,Junit,在我需要对其进行单元测试的类中,有一个部分使用System.err.print。当测试到达该行时,我们如何抛出异常或通过任何@rule来通过测试? 要编写代码,请执行以下操作: if (a == null) { System.err.println("Error: empty file"); System.exit(1); } 谢谢您可以将err重定向到引发异常的流: OutputStream os = new OutputSt
if (a == null) {
System.err.println("Error: empty file");
System.exit(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
。您可以使用System\setErr
临时替换测试方法主体的System.err
。它可以是一个mock,以便您可以强制执行任何您喜欢的行为,也可以是一个流,您可以在其中累积类输出,以便稍后进行验证
请确保在测试方法结束之前将原始流放回原处,以免影响其他测试或测试框架本身。您可能希望将该行和后续内容包装到另一个类中并模拟它。当你到达目的地时,你会遇到问题
System.exit(1)
因为这将迫使JVM退出,您的测试将无法通过
查看现有问题以获取帮助。使用方法sytemExit(int代码)创建一个类SystemExitter。调用该方法而不是直接调用System.exit(…),这样您可以通过模拟SystemExitter(使用PowerMock、EasyMock、Mockito等)来测试代码
尽管您永远无法测试SystemExitter的sytemExit(…)方法,但它将只有一行代码。您可以通过PowerMock模拟
System.err.println()
的行为。该库支持测试使用java.lang.System的代码。