我们正在测试单元测试中的异常
@Test(expected=IOException.class)
public void test() {
// run some code that throws IOException.
}
测试正在通过,但作为运行测试的maven构建的一部分,stacktrace进入控制台输出。 无论如何,在测试中可以忽略这个堆栈跟踪。
答案 0 :(得分:18)
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
</configuration>
</plugin>
将上面的代码放入pom.xml的插件部分。 redirectTestOutputToFile
将从控制台输出中删除堆栈跟踪。显然,用你正在使用的版本替换surfire版本。
BTW redirectTestOutputToFile
参数在failsafe plugin中也可用,因此您可以以相同的方式将其应用于集成测试。
答案 1 :(得分:4)
没有一种很好的方法可以做到这一点,无论如何它都不值得。我假设打印的堆栈跟踪来自被调用的代码,而不是来自您的测试代码:
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或类似日志进行日志记录,则可以使用@Rule
临时将日志记录级别设置为INFO,以便日志中不会显示该异常。同样,如果测试失败,调试将不会在您最需要的时候出现。
我在项目构建输出中一直得到这些异常堆栈跟踪。我接受它并祝贺自己正确测试错误情况: - )
答案 2 :(得分:3)
System.err是打印到的,它是一个可以在运行时修改的PrintStream。所以在System.err中,放置一个由OutputStream创建的新PrintStream,在调用write(int i)
时不打印任何内容:
System.setErr(new PrintStream(new OutputStream(){public void write(int i){}}));
请记住在您完成抑制输出后备份System.err中的当前PrintStream,否则您将无法收到其他可能实际有用的错误。
您可以在BeforeClass中备份和设置假冒,并在AfterClass中恢复或类似。
附加说明:
您可以在测试中使用更完整的一行:
java.io.PrintStream realErrorStream = System.err;
System.setErr(new java.io.PrintStream(new java.io.OutputStream(){public void write(int i){}}));
...
System.setErr(realErrorStream);
答案 3 :(得分:1)
解决方法断言我实际上没有看到堆栈跟踪就抓住了预期的异常
@Test
public void test() {
try {
// run some code that throws IOException.
} catch (Exception ex) {
assertTrue(ex.getClass().equals(IOException.class));
}
}
答案 4 :(得分:-1)
您可以做的一件事是不使用预期的异常功能。有时我这样做,当测试太多时,我不希望真正的异常被忽略,因为maven构建已经打印出预期的预期。
boolean exceptionOccured = false;
try {
// My test here);
} catch (ExpectedException ex) {
exceptionOccured = true;
}
if(!exceptionOccured) {
Asser.fail();
}
答案 5 :(得分:-1)
就我而言,我在catch块中执行了一个带有Thrown异常的assertNotNull。这样如果在代码中发生相反的情况,我将得到assertNotNull Failure。是的如果打印了stacktrace,没有什么可恨的。这有一个原因。
//Building the precondition for test case goes here.
try {
begin();
System.out.println("Expected ConstraintViolationException occurred");
dao.save(myObject);
commit();
} catch (Exception e){
assertNotNull(e);
} finally {
rollback();
}