- @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()) ); } }