簡體   English   中英

Java:Junit4:異常測試不起作用,堅持try-catch塊:

[英]Java: Junit4: Exception testing not working, insists on try-catch block:

我的測試:這是它強調薩克斯之后的東西。 並且堅持認為我有一個try-catch塊....但互聯網上說測試異常的正確方法是@Test(expected=IllegalArgumentException.class)

@Test(expected= XMLClientNotFoind.class)
public void testGetClientFromIP() throws XMLClientNotFound{
    ...
    assertEquals(c, sax.getClientFromIP("101.0.2.01"));
}

方法getClientFromIP在這里:

  public Client getClientFromIP(String ip) throws XMLClientNotFound {
        ...
        throw new XMLClientNotFound();
  }

我的例外:

   public class XMLClientNotFound extends Exception{

    }

首先:

@Test(expected=IllegalArgumentException.class)

不應被視為一種正確的方式,特別是對於這樣的一般例外。 原因是您無法控制測試方法中的哪個語句實際拋出異常。 你也不能在消息標簽,原因等上做任何斷言。

使用try-catch精確地圍繞一條假定要拋出異常的行是正確的方法:

try {
    shouldThrow()
    fail("Expected exception");
} catch(XMLClientNotFound e) {
    assertThat(e).hasMessage("Expected message");  //FEST-Assert syntax
}

您也可以嘗試我前一段時間寫的 JUnit @Rule ,以使您的測試更具可讀性。

您仍然需要為已檢查的異常定義throws子句。 @Test(expected=...)部分只是說JUnit,你希望你的測試用例拋出那個異常。

是否有可能在測試方法中有其他代碼拋出不同的異常?

例如...

@Test(expected= XMLClientNotFoind.class)
public void testGetClientFromIP() throws XMLClientNotFound{

    thisMethodThrows_ExceptionX();

    assertEquals(c, sax.getClientFromIP("101.0.2.01"));
} 

在上面的例子中,編譯器會抱怨,因為你沒有處理ExceptionX。 您可能需要使用try / catch包圍或者在測試方法簽名中throws ExceptionX

通常,在測試方法中測試一件事是個好主意。 如果您期望該方法拋出異常,我不理解斷言; 沒有什么可以斷言的,因為它不會返回任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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