2011-02-08 61 views
4

我的測試:這是它強調薩克斯之後的東西。並堅持認爲我有一個try-catch塊....但互聯網說,來測試異常的正確方法是@Test(expected=IllegalArgumentException.class)Java:Junit4:異常測試不起作用,堅持嘗試catch塊:

@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{ 

    } 

回答

7

首先:

@Test(expected=IllegalArgumentException.class) 

不應被視爲一種正確的方式,尤其是對於這種通用的例外情況。原因是你無法控制你的測試方法中哪個語句實際拋出異常。您也可以不使消息標籤,事業等

使用try-catch正是圍繞這是假設拋出一個異常的線路上的任何說法是正確的方式去:

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

你可能也可以嘗試JUnit @Rule,我在前段時間使用我wrote以使您的測試更具可讀性。

1

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

0

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

例如...

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

    thisMethodThrows_ExceptionX(); 

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

在上述情況下,編譯器會抱怨,因爲你不處理ExceptionX。你可能不得不圍繞try/catch或在測試方法簽名中說throws ExceptionX

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