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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用JUnit的ExpectedException和@Rule测试自定义异常

發(fā)布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JUnit的ExpectedException和@Rule测试自定义异常 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
異常測試

為什么要測試異常流? 就像所有代碼一樣,測試覆蓋率會在代碼和應(yīng)該生成的業(yè)務(wù)功能之間寫一個合同,從而為您提供代碼的有效文檔 ,以及增加的盡早且經(jīng)常強(qiáng)調(diào)功能的功能。 我不會介紹測試的許多好處,而是只關(guān)注異常測試。

有很多方法可以測試從一段代碼引發(fā)的異常流。 假設(shè)您有一個受保護(hù)的方法,該方法要求參數(shù)不為null。 您將如何測試該狀況? 引發(fā)異常時,如何防止JUnit報告失敗? 該博客涵蓋了幾種不同的方法使用JUnit的的ExpectedException使用JUnit的@rule功能實(shí)現(xiàn)的高潮。

“舊”方式

在不久的將來,測試異常的過程需要大量的樣板代碼,您可以在其中啟動try / catch塊,如果代碼未產(chǎn)生預(yù)期的行為,則報告失敗,然后捕獲異常以查找異常。具體類型。 這是一個例子:

public class MyObjTest {@Testpublic void getNameWithNullValue() {try {MyObj obj = new MyObj();myObj.setName(null);fail('This should have thrown an exception');} catch (IllegalArgumentException e) {assertThat(e.getMessage().equals('Name must not be null'));}} }

從這個舊示例中可以看到,測試用例中的許多行只是為了支持缺少專門測試異常處理的功能。 使用try / catch方法的一個好處是可以測試特定消息和預(yù)期異常上的任何自定義字段 。 我們將通過JUnit的ExpectedException和@Rule注釋進(jìn)一步探討這一點(diǎn)。

JUnit添加了預(yù)期的異常

JUnit通過添加@Test注釋字段“ expected”來響應(yīng)用戶對異常處理的需求。 目的是,如果引發(fā)的異常類型與注釋中存在的異常類匹配,則整個測試用例將通過。

public class MyObjTest {@Test(expected = IllegalArgumentException.class)public void getNameWithNullValue() {MyObj obj = new MyObj();myObj.setName(null);} }

從較新的示例中可以看到,樣板代碼要少得多,并且測試非常簡潔,但是存在一些缺陷 。 主要缺陷是測試條件太寬泛。 假設(shè)簽名中有兩個變量,并且兩個變量都不能為null,那么如何知道為IllegalArgumentException拋出了哪個變量呢? 當(dāng)您擴(kuò)展了Throwable并需要檢查字段的存在時會發(fā)生什么? 在繼續(xù)閱讀時,請記住這些,隨后將有解決方案。

JUnit @Rule和ExpectedException

如果查看前面的示例,可能會看到期望拋出IllegalArgumentException,但是如果您有一個自定義異常,該怎么辦? 如果要確保該消息包含特定的錯誤代碼或消息怎么辦? 這是JUnit真正出色的地方,它提供了專門為異常測試量身定制的JUnit @Rule對象。 如果您不熟悉JUnit @Rule,請?jiān)诖颂庨喿x文檔 。

ExpectedException

JUnit提供了一個JUnit類ExpectedException,該類旨在用作@Rule。 ExpectedException允許您的測試聲明預(yù)期會出現(xiàn)異常,并為您提供一些基本的內(nèi)置功能來清楚地表達(dá)預(yù)期的行為。 與@Test(expected)批注功能不同,ExpectedException類允許您通過Hamcrest匹配器庫測試特定的錯誤消息和自定義字段。

JUnit的ExpectedException的示例

import org.junit.rules.ExpectedException;public class MyObjTest {@Rulepublic ExpectedException thrown = ExpectedException.none();@Testpublic void getNameWithNullValue() {thrown.expect(IllegalArgumentException.class);thrown.expectMessage('Name must not be null');MyObj obj = new MyObj();obj.setName(null);} }

如前所述,該框架允許您測試特定消息,以確保在測試專門尋找的情況下拋出異常。 當(dāng)懷疑多個參數(shù)的可空性時,這將非常有用。

自定義字段

可以說,ExpectedException框架最有用的功能是能夠使用Hamcrest匹配器測試您的自定義/擴(kuò)展異常。 例如,您有一個自定義/擴(kuò)展的異常將被拋出到一個方法中,并且該異常內(nèi)部有一個“ errorCode”。 如何在不從上面列出的try / catch塊中引入樣板代碼的情況下測試該功能? 定制匹配器怎么樣!

可以從以下網(wǎng)址獲得此代碼: https : //github.com/mike-ensor/custom-exception-testing

解決方案:首先是測試用例

import org.junit.rules.ExpectedException;public class MyObjTest {@Rulepublic ExpectedException thrown = ExpectedException.none();@Testpublic void someMethodThatThrowsCustomException() {thrown.expect(CustomException.class);thrown.expect(CustomMatcher.hasCode('110501'));MyObj obj = new MyObj();obj.methodThatThrowsCustomException();} }

解決方案:自定義匹配器

import com.thepixlounge.exceptions.CustomException; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher;public class CustomMatcher extends TypeSafeMatcher<CustomException> {public static BusinessMatcher hasCode(String item) {return new BusinessMatcher(item);}private String foundErrorCode;private final String expectedErrorCode;private CustomMatcher(String expectedErrorCode) {this.expectedErrorCode = expectedErrorCode;}@Overrideprotected boolean matchesSafely(final CustomException exception) {foundErrorCode = exception.getErrorCode();return foundErrorCode.equalsIgnoreCase(expectedErrorCode);}@Overridepublic void describeTo(Description description) {description.appendValue(foundErrorCode).appendText(' was not found instead of ').appendValue(expectedErrorCode);} }

注意:請?jiān)L問https://github.com/mike-ensor/custom-exception-testing以獲取可用的Hamcrest Matcher,JUnit @Rule和ExpectedException的副本。

在那里,您可以快速概覽一下測試代碼引發(fā)的異常的不同方法,以及從自定義異常類中測試特定消息和字段的能力。 請具體說明您的測試用例,并嘗試針對您為測試設(shè)置的確切用例,請記住,測試可以避免引入副作用漏洞!

祝您編程愉快,別忘了分享!

參考:在Mike的站點(diǎn)博客上,從JCG合作伙伴 Mike 那里 ,使用JUnit的ExpectedException和@Rule測試自定義異常 。


翻譯自: https://www.javacodegeeks.com/2012/10/testing-custom-exceptions-with-junits.html

總結(jié)

以上是生活随笔為你收集整理的使用JUnit的ExpectedException和@Rule测试自定义异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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