[英]TestNG how to test exceptions in unit testing
我需要測試異常,但它收到以下錯誤。
org.testng.TestException:
Method ContactIdentifierHelperTest.test()
[pri:0, instance:se.cambio.contactadministration.contact.helper.ContactIdentifierHelperTest@6d7b4f4c]
should have thrown an exception of type class SpiderException
測試方法:
@Test(expectedExceptions = { SpiderException.class })
public void test() {
ContactData contactData = getContactData();
contactIdentifierHelper.getSpellId(contactData);
}
測試方法:
public String getSpellId(final ContactData contactData)
{
String s = null;
try
{
s = someMethod();
}
catch (SpiderException e)
{
e.printStackTrace();
}
return s;
}
我哪里做錯了?
預期的行為是您的方法拋出異常並且您的測試失敗,但它不可能永遠成功(這是正確的),因為您在方法的主體中捕獲了異常。
為了拋出異常,您可以簡單地擁有:
public String getSpellId(final ContactData contactData) throws SpiderException
{
return someMethod();
}
但是,請記住,只有當someMethod()
有效地拋出異常時,您的測試才會成功!
現在,讓我說一句:這個測試沒有任何意義:您正在測試getSpellId
但您的業務邏輯在someMethod
,而且, getSpellId
接受一個從未在正文中使用過的參數......
我建議你改變你對這件事的看法。
您需要一種可重復、可預測的方式讓您的測試方法拋出異常。 實現這一目標的一種方法是通過某些輸入。
想象一下你的方法看起來像這樣:
public String getSpellId(final ContactData contactData) throws SpiderException
{
if ( contactData == null ) throw new ArgumentException("input is null")
//some other code
}
這是可重復的,您始終可以通過傳遞 null 來觸發異常。 你知道你的代碼應該如何表現,沒有不確定性,你可以測試這種行為。
然而,您擁有的是另一個方法調用,它可能會失敗,但您不知道如何以及為什么。 在單元測試方面,這是一個很大的問題。
為您的其他方法添加一個異常測試可能會更好地為您服務,而不必為此煩惱。
你真正想要避免的是你的測試對被測代碼有太多的了解。 你不想為了實現你想要的東西而不得不經歷多少層,因為這給你留下了脆弱的測試,每次代碼更改發生時都需要更改。
因此,改變您對代碼的看法,並致力於使其可測試。 另外,如果你想測試一個異常,你必須確保你沒有捕捉到那個異常,因為這會隱藏實際的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.