hs76
hs76

Reputation: 191

How to check that a List contains only certain unrelated class types using junit's assertThat?

Would appreciate some help with hamcrest and junit matchers... :)

I'm using junit-4.11.jar and hamcrest-core-1.3.jar on Eclipse Kepler with sun's jdk 1.6.0_30.

I have a class that holds an instance of any unknown type like so:

class UnknownClassHolder {
    private Class<?> clazz;
    public Class<?> getClazz() {
        return clazz;
    } 
    public void setClazz(Class<?> clazz) {
        this.clazz = clazz;
    }
}

clazz can be any class.

I want to my junit test to be something like this:

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's assertThat doesn't like this. It doesn't compile due to Integer & Vector Types not being related to each other via sub/super classes:

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

Is there a more succinct way to do this other than:

assertThat(u.getClazz().getName(), either(is(Integer.class.getName())).or(is(Vector.class.getName())));

Is there a particular reason for using Matcher<? super T> rather than Matcher<?> in the org.hamcrest.MatcherAssert.assertThat(...) method?

Thanks.

Upvotes: 3

Views: 1988

Answers (1)

David Harkness
David Harkness

Reputation: 36532

First, you should be using is instead of isA since you're asserting that one class equals another. isA is for testing that an object is an instance of some class. Second, the only thing I can make work is forcing the compiler to see these as raw Objects.

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

Upvotes: 1

Related Questions