- @Test(expected=Exception)
@Test(expected=ArrayIndexOutOfBoundsException.class)
public void display() {
arr.display();
arr.get(-1); // 抛异常:ArrayIndexOutOfBoundsException
}
被认为是一种不好的做法:期待一般的Exception,RuntimeException甚至是Throwable。代码可能会在预期的其他地方抛出异常而测试仍然会通过!
无法断言异常消息
- ExpectedException Rule
@Rule
public final ExpectedException exception = ExpectedException.none();
@Test
public void display() {
arr.display();
exception.expect(ArrayIndexOutOfBoundsException.class);
// exception.expectMessage("数据指针越界!");
arr.get(-1); // 抛异常:ArrayIndexOutOfBoundsException
}
这种方式比@Test(expected=ArrayIndexOutOfBoundsException.class)更好,如果是在调用arr.display(方法之前就已经抛出异常的话,测试结果就不是我们想要的了。
ExpectedException还能够验证异常信息,如exception.expectMessage(“there is an exception!”);
- JUnit 5 assertThrows
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class Junit5ExceptionTestingTest { // non public, new to JUnit5
@Test
@DisplayName("Junit5 built-in Assertions.assertThrows and Assertions.assertAll")
@Tag("exception-testing")
void exceptionTest() {
Throwable throwable = assertThrows(MyRuntimeException.class, new Thrower()::throwsRuntime);
assertAll(
() -> assertEquals("My custom runtime exception", throwable.getMessage()),
() -> assertNull(throwable.getCause())
);
}
}