在 Junit 中测试异常时忽略堆栈跟踪
我们正在测试单元测试中的异常
@Test(expected=IOException.class)
public void test() {
// run some code that throws IOException.
}
测试正在通过,但作为运行测试的 maven 生成的一部分,堆栈跟踪位于控制台输出中。无论如何,是否可以在测试中忽略此堆栈跟踪。
我们正在测试单元测试中的异常
@Test(expected=IOException.class)
public void test() {
// run some code that throws IOException.
}
测试正在通过,但作为运行测试的 maven 生成的一部分,堆栈跟踪位于控制台输出中。无论如何,是否可以在测试中忽略此堆栈跟踪。
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
</configuration>
</plugin>
将上述代码放入pom.xml的插件部分。redirectTestOutputToFile
将从控制台输出中删除堆栈跟踪。显然,将 surfire 的版本替换为您正在使用的版本。
顺便说一句,该参数在故障安全插件中也可用,因此您可以以相同的方式将其应用于集成测试。redirectTestOutputToFile
没有一个好方法可以做到这一点,无论如何都不值得。我假设打印的堆栈跟踪来自被调用的代码,而不是来自测试代码:
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
我在项目生成输出中一直收到这些异常堆栈跟踪。我只是接受它,并祝贺自己,我正在正确测试错误条件:-)