Hamcrest 1.3 と JUnit 4.11 での NoSuchMethodError 質問する

Hamcrest 1.3 と JUnit 4.11 での NoSuchMethodError 質問する

NoSuchMethodErrorJUnit と 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

このブログは私にとって同じ問題を解決するのに役立ちました:

https://tedvinke.wordpress.com/2013/12/17/mixing-junit-hamcrest-and-mockito-explaining-nosuchmethoderror/

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>

おすすめ記事