簡體   English   中英

TestNG如何在單元測試中測試異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM