亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
使用JUnit測試預期異常
作者:踏雁尋花 發布時間:[ 2017/4/26 11:22:28 ] 推薦標簽:單元測試 Junit

  開發人員常常使用單元測試來驗證的一段兒代碼的操作,很多時候單元測試可以檢查拋出預期異常(expected exceptions)的代碼。在Java語言中,JUnit是一套標準的單元測試方案,它提供了很多驗證拋出的異常的機制。本文探討一下他們的優點。
  我們拿下面的代碼作為例子,寫一個測試,確保canVote() 方法返回true或者false, 同時你也能寫一個測試用來驗證這個方法拋出的IllegalArgumentException異常。
  public class Student {
  public boolean canVote(int age) {
  if (i<=0) throw new IllegalArgumentException("age should be +ve");
  if (i<18) return false;
  else return true;
  }
  }
  (Guava類庫中提供了一個作參數檢查的工具類–Preconditions類,也許這種方法能夠更好的檢查這樣的參數,不過這個例子也能夠檢查)。
  檢查拋出的異常有三種方式,它們各自都有優缺點:
  1.@Test(expected…)
  @Test注解有一個可選的參數,”expected”允許你設置一個Throwable的子類。如果你想要驗證上面的canVote()方法拋出預期的異常,我們可以這樣寫:
  @Test(expected = IllegalArgumentException.class)
  public void canVote_throws_IllegalArgumentException_for_zero_age() {
  Student student = new Student();
  student.canVote(0);
  }
  簡單明了,這個測試有一點誤差,因為異常會在方法的某個位置被拋出,但不一定在特定的某行。
  2.ExpectedException
  如果要使用JUnit框架中的ExpectedException類,需要聲明ExpectedException異常。
  @Rule
  public ExpectedException thrown= ExpectedException.none();
  然后你可以使用更加簡單的方式驗證預期的異常。
  @Test
  public void canVote_throws_IllegalArgumentException_for_zero_age() {
  Student student = new Student();
  thrown.expect(IllegalArgumentException.class);
  student.canVote(0);
  }
  或者可以設置預期異常的屬性信息。
  @Test
  public void canVote_throws_IllegalArgumentException_for_zero_age() {
  Student student = new Student();
  thrown.expect(IllegalArgumentException.class);
  thrown.expectMessage("age should be +ve");
  student.canVote(0);
  }
  除了可以設置異常的屬性信息之外,這種方法還有一個優點,它可以更加精確的找到異常拋出的位置。在上面的例子中,在構造函數中拋出的未預期的(unexpected) IllegalArgumentException 異常將會引起測試失敗,我們希望它在canVote()方法中拋出。
  從另一個方面來說,如果不需要聲明更好了
  @Rule
  public ExpectedException thrown= ExpectedException.none();
  它像不需要的噪音一樣,如果這樣很好了
  expect(RuntimeException.class)
  或者:
  expect(RuntimeException.class, “Expected exception message”)
  或者至少可以將異常和信息當做參數傳進去
  thrown.expect(IllegalArgumentException.class, “age should be +ve”);
  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()方法,如果預期異常沒有拋出會導致信息的誤報。我曾經犯過這樣的錯誤。
  總之,這三種方法都可以測試預期拋出的異常,各有優缺點。對于我個人而言,我會選擇第二種方法,因為它可以非常精確、高效的測試異常信息。
  原文鏈接: javacodegeeks 翻譯: ImportNew.com - 踏雁尋花
  譯文鏈接: http://www.importnew.com/10079.html

軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 成人羞羞视频网站 | 欧美一级视频免费观看 | 成人毛片免费观看视频在线 | 丰满寡妇一级毛片 | 久久天天躁夜夜躁狠狠躁2015 | 亚洲免费成人 | 成人免费观看视频高清视频 | 亚洲一页 | metcn人体亚洲一区 | 国产伦人伦偷精品视频 | 狠狠色噜噜狠狠狠狠狠色综合久久 | 亚欧成人一区二区 | 97福利视频导航欧美一区 | 黄茄子视频| 深夜福利视频网 | 一级特色黄色片 | 91在线 | 亚洲 | 国产精品视频一 | 久操精品在线观看 | 38在线视频 | 国产日韩精品一区在线不卡 | 一级特黄视频 | 一级做a爱片在线播放 | 激情小视频网站 | 进来综合网 | 色偷偷888欧美精品久久久 | 亚洲最大福利视频网站 | 成人毛片免费免费 | 可以免费看的毛片 | 一区在线免费 | 久久精品国产亚洲a | 毛片无遮挡高清免费观看 | 免费一级片观看 | 在线精品欧美日韩 | 在线中文字日产区乱码 | 久久中文字幕免费视频 | 亚洲欧美日韩中文综合在线不卡 | 免费黄色网址在线观看 | 国产黄色大片又色又爽 | 亚洲日本一区二区三区在线 | 亚洲欧美精品日韩欧美 |