junit - 如何使用 junit 的 assertThat 检查列表是否仅包含某些不相关的类类型?

标签 junit matcher hamcrest

希望在 hamcrest 和 junit 匹配器方面得到一些帮助...:)

我在 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 的 assertThat 不喜欢这样。由于整数和向量类型不通过子类/父类(super class)相互关联,因此无法编译:

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(...)方法?

谢谢。

最佳答案

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

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

关于junit - 如何使用 junit 的 assertThat 检查列表是否仅包含某些不相关的类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21996049/

相关文章:

java - 比较对象的属性值,但不比较对象类型

java - 无法使用 junit 测试异常

java - doNothing() 不适用于 Spring 中模拟的 @Autowired 字段

使用反射和匹配器的Java方法

java - 使用模式组查找第一个单词

java - 为什么坚持接口(interface)的所有实现都扩展基类?

junit - 在 kotlin 中释放变量

java - Powermock 框架如何创建模拟对象?

java - 匹配句子java中列表/数组的任何单词

java - 如何处理 Hamcrest 匹配器的此错误