- Java 7
- JUnit 4.11
我正在编写测试来验证我的方法的契约,例如,参数不能为 null
,int
参数必须为正,等等。当契约是违反时,抛出的异常类型反射(reflect)了它失败的原因,例如 NullPointerException
或 IllegalArgumentException
。有时我不关心抛出这两个中的哪一个,只关心抛出其中之一。 (是的,我应该测试确切的异常类型,但请耐心等待...)
我可以使用 JUnit 的 @Test(expected = RuntimeException.class)
(因为 RuntimeException
是 IAE
和 NPE
),但这过于通用,因为被测试的方法可能会抛出一些其他的 RuntimeException
。
相反,我尝试使用 JUnit 的 ExpectedExceptions
类。
这是一个完整的例子:
import org.hamcrest.CoreMatchers;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.CoreMatchers.anyOf;
public class ParameterViolationTest {
private Target target = new Target();
@Rule
public ExpectedException expected = ExpectedException.none();
@Test
public void parameterViolation() {
expected.expect(anyOf(
CoreMatchers.<Class<? extends Exception>>
equalTo(NullPointerException.class),
CoreMatchers.<Class<? extends Exception>>
equalTo(IllegalArgumentException.class)));
// Null parameter violates contract, throws some exception.
target.methodUnderTest(null);
}
private static class Target {
public void methodUnderTest(Object o) {
if (o == null) {
// throw new IllegalArgumentException();
throw new NullPointerException();
}
}
}
}
我希望这个测试通过,但它却失败了:
java.lang.AssertionError:
Expected: (<class java.lang.NullPointerException> or <class java.lang.IllegalArgumentException>)
but: was <java.lang.NullPointerException>
Stacktrace was: java.lang.NullPointerException
at ParameterViolationTest$Target.methodUnderTest(ParameterViolationTest.java:35)
at ParameterViolationTest.parameterViolation(ParameterViolationTest.java:25)
< internal calls... >
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
< internal calls... >
java.lang.AssertionError:
Expected: (<class java.lang.NullPointerException> or <class java.lang.IllegalArgumentException>)
but: was <java.lang.NullPointerException>
Stacktrace was: java.lang.NullPointerException
at ParameterViolationTest$Target.methodUnderTest(ParameterViolationTest.java:35)
at ParameterViolationTest.parameterViolation(ParameterViolationTest.java:25)
< internal calls... >
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
< internal calls... >
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.junit.Assert.assertThat(Assert.java:865)
at org.junit.Assert.assertThat(Assert.java:832)
at org.junit.rules.ExpectedException.handleException(ExpectedException.java:198)
at org.junit.rules.ExpectedException.access$500(ExpectedException.java:85)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:177)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
< internal calls... >
这是怎么回事?
最佳答案
您必须使用 Matchers.instanceOf
而不是 CoreMatchers.equalTo
,因为您正在比较 XXXException
的实例。
expected.expect(anyOf(
instanceOf(NullPointerException.class),
instanceOf(IllegalArgumentException.class)));
关于java - 无法预期 JUnit 的 ExpectedException 出现多个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20568489/