NoSuchMethodError
JUnit と Hamcrest の組み合わせの別のインスタンス。問題のコード:
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();
} } ));
IndexerTest.javaの 152 ~ 157 行をコメント化(commit ac72ce )
NoSuchMethodError を引き起こします (完全な出力については、 http: //db.tt/qkkkTE78 を参照してください)。
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)
セットアップ:
- JUnit 4.11
- ハムクレスト 1.3
- JUnitCoreProvider を使用する Maven の Surefire プラグイン (バージョン 2.14) を使用する
- Java 7 (OpenJDK)
- pomを参照してください(コミットac72ce )
バックグラウンド:
ANoSuchMethodError
は、存在しないメソッドを呼び出す (コンパイルされた) クラスが原因です。JUnit + Hamcrest の組み合わせの特定のケースはdescribeMismatch
、多くの場合、JUnit に含まれる Hamcrest クラスと、Hamcrest ライブラリ内のそれらのクラスのバージョンとの間の非互換性によって引き起こされます。
NoSuchMethodError の解決を試みます。
PomにはHamcrest -library 1.3、Hamcrest-core 1.3、および JUnit 4.11 への明示的な依存関係が (この順序で) 含まれています。 IntelliJ 10.5
JUnit のドキュメントによると、JUnit 4.11 の Maven 依存関係には、コンパイルされた Hamcrest クラスが含まれなくなり、代わりに Hamcrest-core 1.3 に依存します。したがって、
NoSuchMethodError
発生しないはずです。junit および hamcrest 宣言への回答でダンが
mvn dependency:tree
提案したように依存関係ツリーをチェックすると、Hamcrest 1.3 および JUnit 4.11 への明示的な依存関係が示され、これらのファイルへの他の依存関係は示されません (完全な出力については、http: //db.tt/C2OfTDJB を参照してください)。別のテストで
NoSuchMethodError
は、次を使用して回避されました。assertThat( "Zylab detector not available", d.getDetectors(), hasItem(Matchers.<Detector>instanceOf(ZylabMetadataXmlDetector.class)));
IndexerTest.javaの 120 ~ 123 行目(コミットac72ce ) で、より明白な代わりに:
assertThat( "Zylab detector not available", d.getDetectors(), hasItem(isA(ZylabMetadataDetector.class));
の代わりに
<Detector>
使用する明示的な型パラメーター、ハムクレストの への明示的な参照、またはそれらの組み合わせが;を回避したかどうかはわかりません。いじってさまざまなことを試した後、うまくいきました。instanceOf
isA
Matchers
NoSuchMethodException
明示的な型パラメーターを使用しても、エラーは解決/回避されませんでした。
BaseMatcher
代わりにから派生したクラスを使用してもFeatureMatcher
、エラーは解決/回避されませんでした。