在 Junit 中测试异常时忽略堆栈跟踪

2022-09-01 19:13:25

我们正在测试单元测试中的异常

@Test(expected=IOException.class)
     public void test() {
     // run some code that throws IOException.
}

测试正在通过,但作为运行测试的 maven 生成的一部分,堆栈跟踪位于控制台输出中。无论如何,是否可以在测试中忽略此堆栈跟踪。


答案 1
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.7.1</version>
    <configuration>
        <redirectTestOutputToFile>true</redirectTestOutputToFile>
    </configuration>
</plugin>

将上述代码放入pom.xml的插件部分。redirectTestOutputToFile 将从控制台输出中删除堆栈跟踪。显然,将 surfire 的版本替换为您正在使用的版本。

顺便说一句,该参数在故障安全插件中也可用,因此您可以以相同的方式将其应用于集成测试。redirectTestOutputToFile


答案 2

没有一个好方法可以做到这一点,无论如何都不值得。我假设打印的堆栈跟踪来自被调用的代码,而不是来自测试代码:

public class ExpectedExceptionTest {
  @Test(expected = IOException.class)
  public void test() throws Exception {
    foobar();
  }

  public void foobar() throws IOException {
    try {
      throw new IOException();
    } catch (IOException e) {
      e.printStackTrace(System.err);
      throw e;
    }
  }
}

此处,出现在 maven 生成日志中的堆栈跟踪来自您尝试测试的方法的错误处理。您不想更改此错误处理。如果测试失败,那么您想知道发生了什么。

如果更改它,则也会使所测试的代码不必要地复杂化。除了此特定测试之外,您始终希望堆栈跟踪显示。

那么,我们是否可以像其他地方建议的那样,将 System.err 设置为 null?不。如果您致电

System.setErr(null);

然后,这将导致(使用上述错误处理)。NullPointerException

如果您使用log4j或类似方法进行日志记录,则可以使用一个临时将日志记录级别设置为INFO的,以便异常不会出现在日志中。同样,如果测试失败,调试将不会在你最需要它的时候显示。@Rule

我在项目生成输出中一直收到这些异常堆栈跟踪。我只是接受它,并祝贺自己,我正在正确测试错误条件:-)