【问题标题】:How to pass unit test on System.err? [duplicate]如何通过 System.err 的单元测试? [复制]
【发布时间】:2015-06-24 16:30:32
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您可以通过 PowerMock 模拟 System.err.println() 的行为
  • System Rules 库支持测试使用 java.lang.System 的代码。

标签: java unit-testing junit


【解决方案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 是否被抛出。

【讨论】:

    【解决方案2】:

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

    System.exit(1)
    

    因为这将迫使 JVM 退出,您的测试将无法通过。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以使用System#setErr 临时替换System.err 作为测试方法的主体。它可以是一个模拟,以便您可以施加任何您喜欢的行为,也可以是一个流,您将在其中累积类输出以供以后验证。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-14
          • 1970-01-01
          • 1970-01-01
          • 2020-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多