1. ホーム

[解決済み】IntelliJ 10.5でテストを実行すると「NoSuchMethodError: org.hamcrest.Matcher.describeMismatch 」が発生する。

2022-04-03 19:09:10

質問

JUnit-dep 4.10とHamcrest 1.3.RC2を使っています。

以下のようなカスタムマッチャーを作りました。

public static class MyMatcher extends TypeSafeMatcher<String> {
    @Override
    protected boolean matchesSafely(String s) {
        /* implementation */
    }

    @Override
    public void describeTo(Description description) {
        /* implementation */
    }

    @Override
    protected void describeMismatchSafely(String item, Description mismatchDescription) {

        /* implementation */
    }
}

Antを使ってコマンドラインから実行すると、全く問題なく動作します。 しかし、IntelliJから実行すると、次のように失敗します。

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
    at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)

私の推測では、間違ったhamcrest.MatcherAssertを使っているのだと思います。 どのhamcrest.MatcherAssertを使っているか(つまり、hamcrest.MatcherAssertのためにどのjarファイルを使っているか)を見つけるにはどうすればよいですか? 私のクラスパスにある唯一のhamcrest jarは、1.3.RC2です。

IntelliJ IDEAは、JUnitの独自のコピーを使用していますか、それともHamcrestですか?

IntelliJが使用しているランタイムCLASSPATHを出力するにはどうしたらいいですか?

どのように解決するのですか?

問題は、間違った hamcrest.Matcher ではなく hamcrest.MatcherAssert クラスが使用されていました。 これは、私の依存関係の1つが指定していたjunit-4.8の依存関係から引き出されていたのです。

テスト中にどのソースからどのような依存関係(およびバージョン)が含まれているかを確認するには、以下を実行します。

mvn dependency:tree -Dscope=test