使用JUnit 4注释测试多个exception

是否可以在单个JUnitunit testing中测试多个exception? 例如,我知道可以使用一个例外

@Test(expected=IllegalStateException.class) 

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

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

例如(伪代码)

 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个不同的exception(对于2组输入),那么您将需要2个测试。

注释无法实现这一点。

使用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:拦截器:预期的exception
  • JUnit 4.7中的规则

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

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

}

使用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); } 

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

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

您如何期望“预期”的工作? 一个方法只能抛出一个exception。

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

保持测试尽可能简单和短。 JUnit-Test的目的是仅测试一个简单的function或一个单一的故障方式。

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

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

保持简短。

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

问候

 @Test(expected=Exception.class) 

这将抛出所有可能的exception。