使用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。