242

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 ファイル) を見つけるにはどうすればよいですか? AFAICT、私のクラスパスにある唯一の hamcrest jar は 1.3.RC2 です。

IntelliJ IDEA は JUnit または Hamcrest の独自のコピーを使用していますか?

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

4

15 に答える 15

278

hamcrest jar がJUnit jar よりもインポート順序で上位にあることを確認してください。

JUnitorg.hamcrest.Matcherには、おそらく代わりに使用されている独自のクラスが付属しています。

代わりに、hamcrest クラスのない JUnit であるjunit-dep-4.10.jarをダウンロードして使用することもできます。

mockito には hamcrest クラスも含まれているため、move\reorder も必要になる場合があります

于 2011-10-24T15:47:33.550 に答える
177

この問題は、すでに非推奨になっているクラスパスにmockito-allがある場合にも発生します。

可能であれば、単にmockito-coreを含めてください。

junit、mockito、および hamcrest を混在させるための Maven 構成:

<dependencies>
  <dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>1.3</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>
于 2013-05-24T12:49:38.663 に答える
62

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

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

mvn dependency:tree -Dscope=test
于 2011-10-24T21:48:53.097 に答える
28

以下は、今日最も正しいはずです。junit 4.11 は hamcrest-core に依存しているため、 hamcrest 1.1が含まれている(依存していない)ため、mockito-all を使用できないことを指定する必要はまったくありません。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.8</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
于 2014-11-21T10:17:29.740 に答える
15

少し苦労した後、これは私のために働いた

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
 </dependency>

 <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
 </dependency>

 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
 </dependency>
于 2014-04-12T20:13:06.110 に答える
1

Gradle プロジェクトがあり、build.gradle 依存関係セクションが次のようになっている場合:

dependencies {
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'

    testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    testImplementation 'junit:junit:4.12'
//    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'

    compileOnly 'org.projectlombok:lombok:1.18.4'
    apt 'org.projectlombok:lombok:1.18.4'
}

それはこの例外につながります:

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)

この問題を解決するために、「mockito-all」を「mockito-core」に置き換えました。

dependencies {
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'

//    testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    testImplementation 'junit:junit:4.12'
    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'

    compileOnly 'org.projectlombok:lombok:1.18.4'
    apt 'org.projectlombok:lombok:1.18.4'
}

mockito-allmockito-coreの説明はこちらにあります: https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -all-in-mavengradle ベースのプロジェクト/

Mockito 自体に加えて、mockito-all.jar には (1.9.5 の時点で) Hamcrest と Objenesis の 2 つの依存関係も含まれています (再パッケージ化された ASM と CGLIB はしばらく省略します)。その理由は、1 つの JAR 内に必要なものをすべて入れて、クラスパスに配置するためでした。奇妙に見えるかもしれませんが、純粋な Ant (依存関係管理なし) が Java プロジェクトの最も一般的なビルド システムであり、プロジェクトに必要なすべての外部 JAR (つまり、プロジェクトの依存関係とその依存関係) が手動でダウンロードし、ビルド スクリプトで指定します。

一方、mockito-core.jar は単なる Mockito クラスです (再パッケージ化された ASM と CGLIB も含まれます)。Maven または Gradle で使用する場合、必要な依存関係 (Hamcrest および Objenesis) はこれらのツールによって管理されます (自動的にダウンロードされ、テスト クラスパスに配置されます)。使用されているバージョンを上書きすることができます (たとえば、プロジェクトが決して使用しないが、下位互換性のあるバージョンを使用する場合)、さらに重要なことは、これらの依存関係が mockito-all.jar 内に隠されておらず、依存関係分析ツールとのバージョン非互換性の可能性を検出できることです。プロジェクトで依存関係管理ツールが使用されている場合、これははるかに優れたソリューションです。

于 2019-01-06T20:09:56.787 に答える
1

私の場合、junit-vintage から古い hamcrest を除外する必要がありました。

<dependency>
  <groupId>org.junit.vintage</groupId>
  <artifactId>junit-vintage-engine</artifactId>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest</artifactId>
  <version>2.1</version>
  <scope>test</scope>
</dependency>
于 2019-02-09T12:38:46.063 に答える
0

私にとってうまくいったのは、junitテストコンパイルからhamcrestグループを除外することでした。

私のbuild.gradleのコードは次のとおりです。

testCompile ('junit:junit:4.11') {
    exclude group: 'org.hamcrest'
}

IntelliJ を実行している場合はgradle cleanIdea idea clean build、依存関係を再度検出するために実行する必要がある場合があります。

于 2016-05-10T17:48:06.283 に答える