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个测试 .
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?");
}
}
// 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);
}
7 回答
你真的希望测试做一件事,并测试它 . 如果你听起来对我来说是一个很好的考验 .
例如(伪代码)
因此,如果您想测试您的方法抛出2个不同的异常(对于2组输入),那么您将需要2个测试 .
注释无法实现这一点 .
使用JUnit 4.7,您可以使用新的
ExpectedException
规则更多见
JUnit 4.7: Interceptors: expected exceptions
Rules in JUnit 4.7
如果您无法更新到JUnit 4.7,则必须编写表单的裸单元测试
}
使用catch-exception:
虽然使用JUnit 4是不可能的,但如果你切换到允许你编写的TestNG,它是可能的
您如何期望“预期”的工作?一个方法只能抛出一个异常 .
您必须为方法失败的每种方式编写不同的单元测试 . 因此,如果该方法合法地抛出两个异常,那么您需要设置两个测试来强制抛出每个异常的方法 .
保持测试尽可能简单和短 . JUnit-Test的目的是仅测试一个简单的功能或一种单一的故障方式 .
实际上,为了安全起见,您应该为每种可能的执行方式创建至少一个测试 .
通常,这并不总是可行的,因为如果你有一个分析字符串的方法,那么有很多可能的字符串组合你无法涵盖所有内容 .
保持简短 .
您可以轻松地为一种方法提供30-40种测试方法......这真的很重要吗?
问候
这将抛出所有可能的异常 .