Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use the isA-Matcher

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>)

like image 388
danielspaniol Avatar asked Aug 16 '16 18:08

danielspaniol


People also ask

What is Hamcrest matcher?

Hamcrest is a framework that assists writing software tests in the Java programming language. It supports creating customized assertion matchers ('Hamcrest' is an anagram of 'matchers'), allowing match rules to be defined declaratively. These matchers have uses in unit testing frameworks such as JUnit and jMock.

What is matchers in JUnit?

Matchers is an external addition to the JUnit framework. Matchers were added by the framework called Hamcrest. JUnit 4.8. 2 ships with Hamcrest internally, so you don't have to download it, and add it yourself. Matchers are used with the org.

What is matcher in unit testing?

Basically a matcher is an object that defines when two objects match.


2 Answers

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.

like image 113
danielspaniol Avatar answered Oct 18 '22 05:10

danielspaniol


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?

like image 37
GhostCat Avatar answered Oct 18 '22 03:10

GhostCat