JUnit annotation方式
  JUnit中提供了一个expected的annotation来检查异常。

 

@Test(expected = IllegalArgumentException.class)
public void shouldGetExceptionWhenAgeLessThan0() {
Person person = new Person();
person.setAge(-1);
}

  这种方式看起来要简洁多了,但是无法检查异常中的消息。
  ExpectedException rule
  JUnit7以后提供了一个叫做ExpectedException的Rule来实现对异常的测试。

 

@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void shouldGetExceptionWhenAgeLessThan0() {
Person person = new Person();
exception.expect(IllegalArgumentException.class);
exception.expectMessage(containsString("age is invalid"));
person.setAge(-1);
}

  这种方式既可以检查异常类型,也可以验证异常中的消息。
  使用catch-exception库
  有个catch-exception库也可以实现对异常的测试。
  首先引用该库。
  pom.xml
  <dependency>
  <groupId>com.googlecode.catch-exception</groupId>
  <artifactId>catch-exception</artifactId>
  <version>1.2.0</version>
  <scope>test</scope> <!-- test scope to use it only in tests -->
  </dependency>
  然后这样书写测试。
  @Test
  public void shouldGetExceptionWhenAgeLessThan0() {
  Person person = new Person();
  catchException(person).setAge(-1);
  assertThat(caughtException(),instanceOf(IllegalArgumentException.class));
  assertThat(caughtException().getMessage(), containsString("age is invalid"));
  }
  这样的好处是可以的验证异常是被测方法抛出来的,而不是其它方法抛出来的。
  catch-exception库还提供了多种API来进行测试。
  先加载fest-assertion库。
  <dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert-core</artifactId>
  <version>2.0M10</version>
  </dependency>