2011-02-08 59 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

通常,在测试方法中测试一件东西是一个好主意。如果您期望该方法抛出异常,我不理解该断言;没有什么可以断言的,因为它不会返回任何东西。