如何使用junit的assertThat检查List是否只包含某些不相关的类类型?

时间:2014-02-24 18:33:10

标签: junit matcher hamcrest

非常感谢hamcrest和junit matchers的一些帮助...... :)

我在Eclipse Kepler上使用junit-4.11.jar和hamcrest-core-1.3.jar,并使用sun的jdk 1.6.0_30。

我有一个类,它包含任何未知类型的实例,如下所示:

class UnknownClassHolder {
    private Class<?> clazz;
    public Class<?> getClazz() {
        return clazz;
    } 
    public void setClazz(Class<?> clazz) {
        this.clazz = clazz;
    }
}
clazz可以是任何一个类。

我希望我的junit测试是这样的:

class UnknownClassHolderTest {
    @Test
    public void test() {

    ArrayList<UnknownClassHolder> list = new ArrayList<UnknownClassHolder>();

    UnknownClassHolder x = new UnknownClassHolder();
    //lets add an Integer
    x.setClazz(Integer.class);
    list.add(x);

    UnknownClassHolder y = new UnknownClassHolder();
    //lets add a vector
    y.setClazz(Vector.class);
    list.add(y);

    //now check that we added an Integer or a Vector using assertThat
    for (UnknownClassHolder u: list) {
        assertThat(u.getClazz(), anyOf(isA(Integer.class), isA(Vector.class))));
    }
}
}

Junit的断言不喜欢这个。由于整数和整数,它无法编译矢量类型不通过子/超类相互关联:

The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (Class<capture#1-of ?>, AnyOf<Vector>)

除了:

之外,还有更简洁的方法吗?
assertThat(u.getClazz().getName(), either(is(Integer.class.getName())).or(is(Vector.class.getName())));

Matcher<? super T>方法中使用Matcher<?>而不是org.hamcrest.MatcherAssert.assertThat(...)是否有特殊原因?

感谢。

1 个答案:

答案 0 :(得分:1)

首先,您应该使用is而不是isA,因为您断言一个类等于另一个类。 isA用于测试对象是某个类的实例。其次,我唯一可以做的就是强制编译器将它们视为原始Object

assertThat(u.getClazz(), anyOf(is((Object) Integer.class), is((Object) Vector.class)));