不要在JUnit测试中显示抛出的异常消息的堆栈跟踪

时间:2016-11-28 07:11:02

标签: java junit4

在测试抛出的异常消息的消息值时,如下所示:

public void mustFailIfTheActionDoesNotExist() {
        try {
            getAction(UUID.randomUUID().toString());

            fail("Must fail if the action does not exists");
        } catch (MyException ex) {
            Assert.assertEquals("Exception generated on action", ex.getMessage());
        }

异常及其堆栈跟踪在终端上可见。由于我的项目中有数百个类,因此终端只会成为异常消息的堆栈跟踪列表。

有没有办法在运行Junit测试时抑制异常输出到屏幕/终端的堆栈跟踪?

PS:我不想在特定情况下禁止所有单元测试的记录。

2 个答案:

答案 0 :(得分:4)

我猜测您正在测试的代码正在记录异常并抛出异常。别这么做。

在非测试代码中捕获异常时,请执行以下操作之一:

  1. 记录异常并继续
  2. 在不记录的情况下重新抛出异常
  3. 包装异常并抛出包装的异常而不进行任何记录
  4. 如果你这样做,那么任何异常都会被记录一次。

    您还应确保在代码的顶级记录所有异常。这可能需要调用Thread.setDefaultUncaughtExceptionHandler()或`Thread.setUncaughtExceptionHandler()

答案 1 :(得分:1)

在以下测试中,您可以测试是否抛出异常。但抛出异常后,您无法进行测试(如失败)。它们不会被执行。它也不会打印堆栈跟踪。

@Test(expected = MyException.class)
public void mustFailIfTheActionDoesNotExist() throws MyException{
     getAction(UUID.randomUUID().toString());
     fail("Must fail if the action does not exists");
}

在抛出异常后能够进行测试。你可以看看ExpectedException Rule

<强>更新

@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void shouldNotPrintStackTrace() throws ArithmeticException {
    exception.expect(ArithmeticException.class);
    exception.expectMessage(containsString("by zero"));
    System.out.println(10 / 0);
}

以上代码在成功的情况下不显示堆栈跟踪,您可以测试该消息。如果测试失败,则打印堆栈跟踪。