是否可以在单个JUnit单元测试中测试多个异常?我知道可以使用的一个例外,例如
@Test(expected=IllegalStateException.class)
现在,如果我想测试另一个异常(例如,NullPointerException),可以在相同的注释,不同的注释中完成吗,还是我需要完全编写另一个单元测试?
答案 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)
// 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)
这将抛出所有可能的例外。