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>)
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.
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.
Basically a matcher is an object that defines when two objects match.
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.
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?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With