在 JUnit 测试中不显示抛出的异常消息的堆栈跟踪
Do not display stacktrace of thrown exception messages in JUnit test
在像这样测试抛出的异常消息的消息值时:
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 测试 运行 时,是否有办法抑制异常输出到 screen/terminal 的堆栈跟踪?
PS:我不想禁止所有单元测试的日志记录,只是在特定情况下。
在下面的测试中可以测试是否抛出异常。但是在抛出异常后你不能进行测试(比如失败)。它们不会 executed.Also,它不会打印堆栈跟踪。
@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);
}
以上代码在成功的情况下不显示堆栈跟踪,您可以测试消息。如果测试失败,它会打印堆栈跟踪。
我猜您正在测试的代码正在记录一个异常并抛出它。不要那样做。
在非测试代码中捕获异常时,执行以下操作之一:
- 记录异常并继续
- 重新抛出异常而不记录它
- 包装异常并在不进行任何记录的情况下抛出包装的异常
如果您这样做,那么任何异常最多只会被记录一次。
您还应确保所有异常都记录在代码的顶层。这可能需要调用 Thread.setDefaultUncaughtExceptionHandler()
或 `Thread.setUncaughtExceptionHandler()
在像这样测试抛出的异常消息的消息值时:
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 测试 运行 时,是否有办法抑制异常输出到 screen/terminal 的堆栈跟踪?
PS:我不想禁止所有单元测试的日志记录,只是在特定情况下。
在下面的测试中可以测试是否抛出异常。但是在抛出异常后你不能进行测试(比如失败)。它们不会 executed.Also,它不会打印堆栈跟踪。
@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);
}
以上代码在成功的情况下不显示堆栈跟踪,您可以测试消息。如果测试失败,它会打印堆栈跟踪。
我猜您正在测试的代码正在记录一个异常并抛出它。不要那样做。
在非测试代码中捕获异常时,执行以下操作之一:
- 记录异常并继续
- 重新抛出异常而不记录它
- 包装异常并在不进行任何记录的情况下抛出包装的异常
如果您这样做,那么任何异常最多只会被记录一次。
您还应确保所有异常都记录在代码的顶层。这可能需要调用 Thread.setDefaultUncaughtExceptionHandler()
或 `Thread.setUncaughtExceptionHandler()