Java:Junit4:异常测试不起作用,坚持try-catch块:

时间:2011-02-08 20:18:39

标签: java unit-testing

我的测试:这是它强调萨克斯之后的东西。并且坚持认为我有一个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{

    }

3 个答案:

答案 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

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