Another instance of the NoSuchMethodError
for the JUnit & Hamcrest combination.
Offending code:
assertThat(dirReader.document(0).getFields(), hasItem(
new FeatureMatcher<IndexableField, String>(equalTo("Patisnummer"), "Field key", "Field key") {
@Override
protected String featureValueOf(IndexableField actual) {
return actual.name();
} } ));
Commented lines 152–157 in IndexerTest.java (commit ac72ce)
Causes a NoSuchMethodError (see http://db.tt/qkkkTE78 for complete output):
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.FeatureMatcher.matchesSafely(FeatureMatcher.java:43)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:25)
at org.hamcrest.core.IsCollectionContaining.matchesSafely(IsCollectionContaining.java:14)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(TypeSafeDiagnosingMatcher.java:55)
at org.junit.Assert.assertThat(Assert.java:770)
at org.junit.Assert.assertThat(Assert.java:736)
at indexer.IndexerTest.testIndexContainsField(IndexerTest.java:152)
The setup:
- JUnit 4.11
- Hamcrest 1.3
- Using Maven's surefire plugin (version 2.14), which uses its JUnitCoreProvider
- Java 7 (OpenJDK)
- See pom (commit ac72ce)
Background:
A NoSuchMethodError
is caused by (compiled) classes that call non existing methods. The specific case of describeMismatch
and the JUnit + Hamcrest combination is often caused by an incompatibility between Hamcrest classes included in JUnit and versions of those classes in the Hamcrest library.
Attempts to solve the NoSuchMethodError:
The pom contains an explicit dependency on Hamcrest-library 1.3, Hamcrest-core 1.3, and JUnit 4.11, (in that order) as suggested by Garrett Hall in answer to Getting "NoSuchMethodError: org.hamcrest.Matcher.describeMismatch" when running test in IntelliJ 10.5
According to the JUnit documentation the JUnit 4.11 Maven dependency does no longer include compiled Hamcrest classes, instead it has a dependency on Hamcrest-core 1.3; so the
NoSuchMethodError
should not occur.Checking the dependency tree with
mvn dependency:tree
as suggested by Dan in answer to junit and hamcrest declaration shows the explicit dependencies on Hamcrest 1.3 and JUnit 4.11 and no other dependencies to those files (see http://db.tt/C2OfTDJB for the complete output).In another test the
NoSuchMethodError
was avoided by using:assertThat( "Zylab detector not available", d.getDetectors(), hasItem(Matchers.<Detector>instanceOf(ZylabMetadataXmlDetector.class)));
In lines 120–123 of IndexerTest.java (commit ac72ce) instead of the more obvious:
assertThat( "Zylab detector not available", d.getDetectors(), hasItem(isA(ZylabMetadataDetector.class));
I'm uncertain whether the explicit type parameter
<Detector>
, usinginstanceOf
instead ofisA
, the explicit reference to Hamcrest'sMatchers
, or a combination of those avoided theNoSuchMethodException
; after fiddling around and trying different things it worked.Using explicit type parameters did not solve/avoid the error.
Using a class derived from
BaseMatcher
instead ofFeatureMatcher
did not solve/avoid the error.