我的测试:这是它强调萨克斯之后的东西。并且坚持认为我有一个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{
}
答案 0 :(得分:7)
首先:
@Test(expected=IllegalArgumentException.class)
不应被视为一种正确的方式,特别是对于这样的一般例外。原因是您无法控制测试方法中的哪个语句实际抛出异常。你也不能在消息标签,原因等上做任何断言。
使用try-catch
精确地围绕一条假设要抛出异常的行是正确的方法:
try {
shouldThrow()
fail("Expected exception");
} catch(XMLClientNotFound e) {
assertThat(e).hasMessage("Expected message"); //FEST-Assert syntax
}
您可能也会尝试使用我wrote的JUnit @Rule
,以使您的测试更具可读性。
答案 1 :(得分:1)
您仍需要为已检查的例外定义throws
子句。 @Test(expected=...)
部分只是说JUnit,你希望你的测试用例抛出那个异常。
答案 2 :(得分: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
。
一般来说,在测试方法中测试一件事是个好主意。如果您期望该方法抛出异常,我不理解断言;没有什么可以断言的,因为它不会返回任何东西。