检查抛出的异常有三种方式,它们各自都有优缺点:
1.@Test(expected…)
@Test注解有一个可选的参数,"expected"允许你设置一个Throwable的子类。在测试的方法前加入类似下面的句子即可验证方法抛出预期的异常:
@Test(expected = IllegalArgumentException.class)
简单明了,这个测试有一点误差,因为异常会在方法的某个位置被抛出,但不一定在特定的某行。
2.ExpectedException
如果要使用JUnit框架中的ExpectedException类,需要声明ExpectedException异常。
@Rule
public ExpectedException thrown= ExpectedException.none();
然后你可以使用更加简单的方式验证预期的异常。
thrown.expect(异常名);
或者可以设置预期异常的属性信息。
thrown.expect(异常名);
thrown.expectMessage("属性信息");
除了可以设置异常的属性信息之外,这种方法还有一个优点,它可以更加精确的找到异常抛出的位置。
3.Try/catch with assert/fail
在JUnit4之前的版本中,使用try/catch语句块检查异常
@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
Student student = new Student();
try {
student.canVote(0);
} catch (IllegalArgumentException ex) {
assertThat(ex.getMessage(), containsString("age should be +ve"));
}
fail("expected IllegalArgumentException for non +ve age");
}
尽管这种方式很老了,不过还是非常有效的。主要的缺点就是很容易忘记在catch语句块之后需要写fail()方法,如果预期异常没有抛出就会导致信息的误报。