中文JAVA技术平等自由协作创造

Java专题文章博客和开源

常用链接

统计

最新评论

Java中测试异常的多种方式

  使用JUnit来测试Java代码中的异常有很多种方式,你知道几种?
  给定这样一个class.
  Person.java
  public class Person {
  private String name;
  private int age;
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public int getAge() {
  return age;
  }
  public void setAge(int age) {
  if (age < 0 ) {
  throw new IllegalArgumentException("age is invalid");
  }
  this.age = age;
  }
  }
  我们来测试setAge方法。
  Try-catch 方式
  @Test
  public void shouldGetExceptionWhenAgeLessThan0() {
  Person person = new Person();
  try {
  person.setAge(-1);
  fail("should get IllegalArgumentException");
  } catch (IllegalArgumentException ex) {
  assertThat(ex.getMessage(),containsString("age is invalid"));
  }
  }
  这是最容易想到的一种方式,但是太啰嗦。
  JUnit annotation方式托福答案 www.qcwy123.com
  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来进行测试雅思答案 www.tygj123.com
  先加载fest-assertion库。
  <dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert-core</artifactId>
  <version>2.0M10</version>
  </dependency>
  然后可以书写BDD风格的测试。
  @Test
  public void shouldGetExceptionWhenAgeLessThan0() {
  // given
  Person person = new Person();
  // when
  when(person)。setAge(-1);
  // then
  then(caughtException())
  .isInstanceOf(IllegalArgumentException.class)
  .hasMessage("age is invalid")
  .hasNoCause();
  }
  如果喜欢Hamcrest风格的验证风格的话,catch-exception也提供了相应的Matcher API.
  @Test
  public void shouldGetExceptionWhenAgeLessThan0() {
  // given
  Person person = new Person();
  // when
  when(person)。setAge(-1);
  // then
  assertThat(caughtException(), allOf(
  instanceOf(IllegalArgumentException.class)
  , hasMessage("age is invalid")
  ,hasNoCause()));
  }
  第一种最土鳖,第二种最简洁,第四种最靠谱。

posted on 2014-04-20 09:20 好不容易 阅读(188) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
PK10开奖 PK10开奖