Java 无法使用JUnit';期待的例外 爪哇7 JUnit4.11

Java 无法使用JUnit';期待的例外 爪哇7 JUnit4.11,java,unit-testing,junit,Java,Unit Testing,Junit,我正在编写测试来验证我的方法的契约,例如,参数不能为null,int参数必须为正,等等。当契约被违反时,抛出的异常类型反映了它失败的原因,例如NullPointerException或IllegalArgumentException。有时候,我不在乎这两个人中的哪一个被扔了,只在乎其中一个被扔了。(是的,我应该测试确切的异常类型,但请耐心等待……) 我可以使用JUnit的@Test(expected=RuntimeException.class)(因为RuntimeException是IAE和N

我正在编写测试来验证我的方法的契约,例如,参数不能为
null
int
参数必须为正,等等。当契约被违反时,抛出的异常类型反映了它失败的原因,例如
NullPointerException
IllegalArgumentException
。有时候,我不在乎这两个人中的哪一个被扔了,只在乎其中一个被扔了。(是的,我应该测试确切的异常类型,但请耐心等待……)

我可以使用JUnit的
@Test(expected=RuntimeException.class)
(因为
RuntimeException
IAE
NPE
最接近的公共父级),但这过于通用,因为测试中的方法可能会抛出一些其他
RuntimeException

expected.expect(anyOf(
  instanceOf(NullPointerException.class),
  instanceOf(IllegalArgumentException.class)));
相反,我尝试使用JUnit的类

下面是一个完整的示例:

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();
            }
        }
    }
}
import org.hamcrest.CoreMatchers;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.rules.ExpectedException;
导入静态org.hamcrest.CoreMatchers.anyOf;
公共类参数违反测试{
私有目标=新目标();
@统治
public ExpectedException expected=ExpectedException.none();
@试验
public void参数违规(){
期望(

CoreMatchers.您必须使用
Matchers.instanceOf
而不是
CoreMatchers.equalTo
,因为您正在比较
XXXException
的实例

expected.expect(anyOf(
  instanceOf(NullPointerException.class),
  instanceOf(IllegalArgumentException.class)));

啊哈,你是对的,而且它更容易阅读。我现在看到JUnit正在将抛出异常的实例与我告诉它期望的异常类进行比较。(
NullPointerException!=类NullPointerException
)。这就是它失败的原因。谢谢。如何将它与每个异常的不同消息结合起来?我希望
不支持操作异常(“尚未受支持”)
(没有其他消息)和
IllegalArgumentException
(任何消息)。
任意(allOf(…),instanceOf(…)