使用JUnit 4注释测试多个异常

时间:2009-09-11 10:30:08

标签: java junit exception

是否可以在单个JUnit单元测试中测试多个异常?我知道可以使用的一个例外,例如

    @Test(expected=IllegalStateException.class)

现在,如果我想测试另一个异常(例如,NullPointerException),可以在相同的注释,不同的注释中完成吗,还是我需要完全编写另一个单元测试?

7 个答案:

答案 0 :(得分:22)

你真的希望测试做一个的事情,并测试它。如果您不确定将抛出哪个异常,那对我来说听起来不是一个好的测试。

e.g。 (伪代码)

try {
   badOperation();
   /// looks like we succeeded. Not good! Fail the test
   fail();
}
catch (ExpectedException e) {
   // that's fine
}
catch (UnexpectedException e) {
   // that's NOT fine. Fail the test
}

所以如果你想测试你的方法抛出2个不同的异常(对于2组输入),那么你需要进行2次测试。

答案 1 :(得分:12)

注释无法做到这一点。

使用JUnit 4.7,您可以使用新的ExpectedException规则

public static class HasExpectedException {
    @Interceptor
    public ExpectedException thrown= new ExpectedException();

    @Test
    public void throwsNothing() {
    }

    @Test
    public void throwsNullPointerException() {
         thrown.expect(NullPointerException.class);
         throw new NullPointerException();
    }

    @Test
    public void throwsNullPointerExceptionWithMessage() {
        thrown.expect(NullPointerException.class);
        thrown.expectMessage("happened?");
        throw new NullPointerException("What happened?");
    }
}

更多见


如果您无法更新到JUnit 4.7,则必须编写表单的裸单元测试

public test() {
    try {
        methodCall(); // should throw Exception
        fail();
    }
    catch (Exception ex) {
        assert((ex instanceof A) || (ex instanceof B) || ...etc...);
        ...
    }

}

答案 2 :(得分:3)

使用catch-exception

// test 
public void testDo() {

   // obj.do(1) must throw either A or B
   catchException(obj).do(1);
   assert caughtException() instanceof A
       || caughtException() instanceof B;

   // obj.do(2) must throw A but not SubclassOfA
   catchException(obj).do(2);
   assert caughtException() instanceof A
       && !(caughtException() instanceof SubclassOfA);

}

答案 3 :(得分:2)

虽然使用JUnit 4是不可能的,但如果切换到允许你编写的TestNG

,则
@Test(expectedExceptions = {IllegalArgumentException.class, NullPointerException.class})

答案 4 :(得分:0)

您对“预期”的工作有何期待?一个方法只能抛出一个异常。

您必须为方法失败的每种方式编写不同的单元测试。因此,如果该方法合法地抛出两个异常,那么您需要设置两个测试来强制抛出每个异常的方法。

答案 5 :(得分:0)

让测试尽可能简单明了。 JUnit-Test的目的是仅测试一个简单的功能或一种单一的故障方式。

确实,为了安全起见,您应该为每种可能的执行方式创建至少一个测试。

通常,这并不总是可行的,因为如果你有一个分析字符串的方法,那么有很多可能的字符串组合你无法涵盖所有​​内容。

简而言之。

您可以轻松地为一种方法提供30-40种测试方法......这真的很重要吗?

此致

答案 6 :(得分:0)

@Test(expected=Exception.class)

这将抛出所有可能的例外。