Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过System.err上的单元测试?_Java_Unit Testing_Junit - Fatal编程技术网

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

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

在我需要对其进行单元测试的类中,有一个部分使用System.err.print。当测试到达该行时,我们如何抛出异常或通过任何@rule来通过测试? 要编写代码,请执行以下操作:

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的代码。