How to use the isA-Matcher

9.7k Views Asked by At

I have a certain method that delivers a Restriction-object (where Restriction is an interface). And since its implementation is already testet, I just want to test if my method actually delivers a RestrictionImpl-object.
I saw that there are matchers which I can use together with assertThat and I thought, that the isA-matcher is the thing want for this task.

Simplified my code looks like that:

public static Restriction getRestriction() {
    return new RestrictionImpl();
}

and my test looks like that;

@Test
public void getRestriction_returnsRestrictionImpl() {
    assertThat(getRestriction(), isA(RestrictionImpl.class));
}

However this won't compile. All I could do is test, if a RestrictionImpl is a Restriction... but there is no point in doing this.

Am I misunderstanding to purpose of isA? And what is it acually meant for?

UPDATE:
Using assertThat(getRestriction(), is(instanceOf(RestrictionImpl.class))) would work, but I thought that isA is a shortcut for exactly that.
Calling assertThat in the way I want would require it to have the signature assertThat(T, Matcher<? extends T>), but its signature is assertThat(T, Matcher<? super T>)

2

There are 2 best solutions below

0
On BEST ANSWER

I found an issue describing my problem:
https://github.com/hamcrest/JavaHamcrest/issues/27

And it looks like isA simply has the wrong signature in this version of junit. It is meant to be shortcut for is(isIntanceOf(...)), but it is not.

4
On

Probably you want use instanceOf. And you know, those things all have javadoc available in the open. Where isA ... should be exactly what you need. So the problem might be: do you have the required hamcrest core matchers library in your project setup? In other words: maybe you should read this here.

And just some example code, from one of my own projects:

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
...
@Test
public void testWhatever() throws IOException, ApiException {
    try { ...
        fail("should have thrown");
    } catch (IllegalStateException e) {
        e.printStackTrace(); // as expected
        assertThat(e.getCause(), is(instanceOf(SomeClass.class)));

So, do you have those imports there? Do you have the libraries in your project setup to back those imports?