qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          使用JUnit來測試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方式
            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>

          然后可以書寫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-07-10 19:26 順其自然EVO 閱讀(2542) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 苍山县| 綦江县| 锦州市| 巴里| 海盐县| 新建县| 厦门市| 元谋县| 同江市| 娄烦县| 比如县| 绍兴县| 榆社县| 庆元县| 桐柏县| 夏河县| 泰来县| 杭州市| 河源市| 稷山县| 萨迦县| 青铜峡市| 绍兴县| 山西省| 南皮县| 白山市| 巨野县| 进贤县| 东丰县| 高雄市| 高台县| 修水县| 丰原市| 杨浦区| 香格里拉县| 图们市| 肇东市| 青州市| 靖西县| 宽甸| 昌图县|