43

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();
        } } ));

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>使用する明示的な型パラメーター、ハムクレストの への明示的な参照、またはそれらの組み合わせが;を回避したかどうかはわかりません。いじってさまざまなことを試した後、うまくいきました。instanceOfisAMatchersNoSuchMethodException

  • 明示的な型パラメーターを使用しても、エラーは解決/回避されませんでした。

  • BaseMatcher代わりにから派生したクラスを使用してもFeatureMatcher、エラーは解決/回避されませんでした。

NoSuchMethodError?を修正する方法のアイデア

4

8 に答える 8

27

このブログは、同じ問題を解決するのに役立ちました。

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

Mockito と Junit の依存関係内で、作成者は除外を追加しました。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <exclusions>
        <exclusion>
            <artifactId>hamcrest-core</artifactId>
            <groupId>org.hamcrest</groupId>
        </exclusion>
    </exclusions>
</dependency>
于 2014-03-04T12:24:50.237 に答える
2

Eclipse を使用している場合、「Open Type」ツール (CTRL+SHIFT+T) を使用すると、問題のあるパッケージを見つけることができます。クラス名 (Description など) を検索するだけです。異なる JAR から同じクラスが複数出現する場合は注意が必要です。

于 2013-09-25T00:12:52.737 に答える
0

以下のコードを使用して、プロジェクトでこのjar hell問題を解決しました。Gradle

    testCompile (group: 'junit', name: 'junit', version: '4+') {
        exclude group: 'org.hamcrest'
    }
    testCompile ('org.mockito:mockito-core:1+') {
        exclude group: 'org.hamcrest'
    }
    testCompile 'org.hamcrest:java-hamcrest:2.0.0.0'
于 2016-06-07T14:57:52.990 に答える
0

If you are using Eclipse: For me, in eclipse-> project properties->Java build Path moving mockito-all-1.9.5.jar to the bottom of the 'Order and Export' list did the trick. Just above that I have junit-4.11.jar and above that hamcrest-core-1.3.jar

于 2015-07-14T08:50:13.943 に答える