在JUnit中测试预期的异常
單元測試用于驗證一段代碼是否按照開發人員的預期運行。 有時,這意味著檢查代碼是否也會引發預期的異常。 JUnit是Java單元測試的標準,并提供了幾種驗證拋出異常的機制。 本文探討了這些選項及其相對優點。
以下面的簡單代碼段為例。 除了編寫測試以確保canVote()方法返回true或false之外,您還應該編寫測試以驗證是否在期望時拋出IllegalArgumentException 。
( 番石榴前提條件可能更適合這些參數檢查,但該示例仍然有效)。
有3種常見的方法可以檢查是否引發了異常,每種方法都有其自身的優缺點。
1)@Test(預期…)
@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:
@Rulepublic ExpectedException thrown= ExpectedException.none();然后,您可以使用僅指定預期異常的更簡單方法:
@Testpublic void canVote_throws_IllegalArgumentException_for_zero_age() {Student student = new Student();thrown.expect(NullPointerException.class);student.canVote(0);}或者也可以指定預期的異常消息:
@Testpublic void canVote_throws_IllegalArgumentException_for_zero_age() {Student student = new Student();thrown.expect(IllegalArgumentException.class);thrown.expectMessage("age should be +ve");student.canVote(0);}除了可以指定預期的異常消息之外,此ExpectedException方法還具有使您可以更精確地了解預期在何處引發異常的優點。 在上面的示例中,在構造函數中引發意外的IllegalArgumentException會導致測試失敗,因為我們希望測試會在canVote()方法中引發。
附帶一提,如果不需要聲明,那就太好了:
@Rule public ExpectedException thrown= ExpectedException.none();好像是不必要的噪音。 能夠做的很好
expect(RuntimeException.class)要么
expect(RuntimeException.class, “Expected exception message”)或至少能夠在一次對ExpectedException的調用中傳遞異常和消息:
thrown.expect(IllegalArgumentException.class, “age should be +ve”);3)嘗試/抓住斷言/失敗
在JUnit4之前,檢查異常的方法是使用try / catch塊。
@Testpublic 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");}盡管這是一種較舊的方法,但仍然完全有效。 主要缺點是很容易忘記將fail()放在catch后面,如果未引發預期的異常,則會導致誤報。 我過去肯定犯了這個錯誤!
總之,有三種主要的方法可以測試預期的異常情況,每種方法都有其自身的優缺點。 就我個人而言,由于它的精確度和測試異常消息的能力,我通常傾向于ExpectedException方法。
參考:來自Shaun Abram博客博客的JCG合作伙伴 Shaun Abram 在JUnit中測試了預期的異常 。翻譯自: https://www.javacodegeeks.com/2014/02/testing-for-expected-exceptions-in-junit.html
總結
以上是生活随笔為你收集整理的在JUnit中测试预期的异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孩之宝推出“弗兰肯斯坦”联名变形金刚玩具
- 下一篇: 玩JerseyTest(Jersey 2