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