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();
} } ));
152~157行目をコメントアウトインデクサーテスト.java(専念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)
セットアップ:
- JUnit4.11 について
- ハムクレスト 1.3
- Mavenのsurefireプラグイン(バージョン2.14)を使用する。これはJUnitCoreProviderを使用する。
- Java 7 (OpenJDK)
- 見るポンポン(専念ac72ce)
背景:
あNoSuchMethodError
存在しないメソッドを呼び出す (コンパイルされた) クラスによって発生します。JUnit describeMismatch
+ Hamcrest の組み合わせの特定のケースは、JUnit に含まれる Hamcrest クラスと Hamcrest ライブラリ内のそれらのクラスのバージョン間の非互換性によって発生することがよくあります。
NoSuchMethodError を解決しようとします:
pomには、Hamcrest-library 1.3、Hamcrest-core 1.3、JUnit 4.11(この順序で)への明示的な依存関係が含まれています。ギャレット・ホールで答えにIntelliJ 10.5 でテストを実行すると「NoSuchMethodError: org.hamcrest.Matcher.describeMismatch」が発生する
JUnit のドキュメントによると、JUnit 4.11 Maven 依存関係にはコンパイルされた Hamcrest クラスが含まれなくなり、代わりに Hamcrest-core 1.3 に依存するため、この問題は
NoSuchMethodError
発生しないはずです。mvn dependency:tree
提案に従って依存関係ツリーをチェックするダンで答えにjunit と hamcrest の宣言Hamcrest 1.3とJUnit 4.11への明示的な依存関係を示しており、それらのファイルへの他の依存関係はありません(http://db.tt/C2OfTDJB完全な出力については以下を参照してください。別のテストでは、次の
NoSuchMethodError
方法を使用してこの問題を回避しました。assertThat( "Zylab detector not available", d.getDetectors(), hasItem(Matchers.<Detector>instanceOf(ZylabMetadataXmlDetector.class)));
120~123行目インデクサーテスト.java(専念ac72ce) ではなく、より明白な次のようになります。
assertThat( "Zylab detector not available", d.getDetectors(), hasItem(isA(ZylabMetadataDetector.class));
<Detector>
明示的な型パラメータ、instanceOf
の代わりにを使用するisA
、Hamcrest の への明示的な参照Matchers
、またはそれらの組み合わせのどれが ; を回避したのかは不明ですがNoSuchMethodException
、いろいろいじっていろいろ試してみた結果、うまくいきました。明示的な型パラメータを使用してもエラーは解決/回避されませんでした。
BaseMatcher
の代わりに派生したクラスを使用しても、FeatureMatcher
エラーは解決/回避されませんでした。
修正方法のアイデアはNoSuchMethodError
?
ベストアンサー1
このブログは私にとって同じ問題を解決するのに役立ちました:
Mockito と Junit の依存関係内に、著者は excludes を追加しました:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<exclusions>
<exclusion>
<artifactId>hamcrest-core</artifactId>
<groupId>org.hamcrest</groupId>
</exclusion>
</exclusions>
</dependency>