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