日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在JUnit中测试预期的异常

發(fā)布時(shí)間:2023/12/3 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在JUnit中测试预期的异常 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

單元測(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 。

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;}}

( 番石榴前提條件可能更適合這些參數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。