在IntelliJ 10.5中运行测试时获取“NoSuchMethodError:org.hamcrest.Matcher.describeMismatch”

时间:2011-10-23 22:29:23

标签: java junit intellij-idea junit4 hamcrest

我正在使用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(即哪个jar文件用于hamcrest.MatcherAssert)? AFAICT,我班级路径中唯一的火腿罐是1.3.RC2。

IntelliJ IDEA是否使用它自己的JUnit或Hamcrest副本?

如何输出IntelliJ正在使用的运行时CLASSPATH?

14 个答案:

答案 0 :(得分:260)

确保导入订单上的 hamcrest jar比 JUnit jar更高。

JUnit 附带了自己的org.hamcrest.Matcher类,可能正在使用它。

你也可以下载并使用 junit-dep-4.10.jar ,而不是没有hamcrest类的JUnit。

mockito也有hamcrest类,所以你可能需要移动\重新排序

答案 1 :(得分:158)

当你的类路径上有 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>

答案 2 :(得分:57)

问题在于使用了错误的hamcrest.Matcher,而不是hamcrest.MatcherAssert类。这是从我的依赖项之一指定的junit-4.8依赖项中提取的。

要查看测试时从哪个源包含哪些依赖项(和版本),请运行:

mvn dependency:tree -Dscope=test

答案 3 :(得分:26)

以下应该是今天最正确的。注意,junit 4.11依赖于hamcrest-core,因此你根本不需要指定mockito-all,因为它包含(不依赖于)hamcrest 1.1

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

答案 4 :(得分:13)

在经过一番努力后,这对我有用

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

答案 5 :(得分:4)

尝试

expect(new ThrowableMessageMatcher(new StringContains(message)))

而不是

expectMessage(message)

您可以编写自定义ExpectedException或实用程序方法来包装代码。

答案 6 :(得分:2)

我知道这是一个旧线程但是解决了这个问题的是将以下内容添加到我的build.gradle文件中。 如上所述,Php

存在兼容性问题

可能有用post

mockito-all

答案 7 :(得分:0)

对我有用的是从junit test compile中排除hamcrest组。

以下是我的build.gradle中的代码:

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

如果您正在运行IntelliJ,则可能需要运行gradle cleanIdea idea clean build以再次检测依赖项。

答案 8 :(得分:0)

我知道这不是最好的答案,但是如果你不能让类路径工作,这是一个B计划解决方案。

在我的测试类路径中,我添加了以下接口,其中包含describeMismatch方法的默认实现。

package org.hamcrest;

/**
 * PATCH because there's something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher
 * implements the describeMismatch method, but it doesn't work for me. 
 */
public interface Matcher<T> extends SelfDescribing {

    boolean matches(Object item);

    default void describeMismatch(Object item, Description mismatchDescription) {
        mismatchDescription.appendDescriptionOf(this).appendValue(item);
    }

    @Deprecated
    void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}

答案 9 :(得分:0)

我有一个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-all mockito-core 之间的解释可以在这里找到: https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito-all-in-mavengradle-based-projects/

  

mockito-all.jar除Mockito本身外还包含(截至1.9.5版本)两个   依赖项:Hamcrest和Objenesis(我们省略重新包装的ASM和   CGLIB)。原因是拥有所需的一切   放在一个JAR中,将其放在类路径中。看起来很奇怪   但请记住,Mockito的开发始于   纯Ant(无依赖管理)是最受欢迎的构建   Java项目和系统所需的所有外部JAR的系统   项目(即我们项目的依存关系及其依存关系)   手动下载并在构建脚本中指定。

     

另一方面,mockito-core.jar只是Mockito类(也包含   重新包装的ASM和CGLIB)。与必需的Maven或Gradle一起使用时   依赖关系(Hamcrest和Objenesis)由这些工具管理   (自动下载并放在测试类路径中)。它允许   覆盖使用的版本(例如,如果我们的项目从不使用,但   向后兼容版本),但更重要的是   依赖关系没有隐藏在嘲笑-all.jar中,这允许   通过依赖关系分析检测到可能的版本不兼容   工具。当依赖项管理工具是   在项目中使用。

答案 10 :(得分:0)

就我而言,我必须从junit-vintage中排除较旧的hamcrest:

 <TouchableOpacity onPress = {() => this.props.navigation.navigate('demo')}>
          <View style = {{height: responsiveHeight(8), justifyContent:'center'}}>
            <Text style = {{fontSize: responsiveFontSize(2), color: 'black', fontFamily: 'Nunito-Regular', paddingLeft: 30 }} >My Cart</Text>
          </View>
        </TouchableOpacity>
        
        {this.state.customer &&
          <TouchableOpacity onPress = {() => this.props.navigation.navigate('demo1')}>
                  <View style = {{height: responsiveHeight(8), justifyContent:'center'}}>
                    <Text style = {{fontSize: responsiveFontSize(2), color: 'black', fontFamily: 'Nunito-Regular', paddingLeft: 30 }} >Account</Text>
                  </View>
          </TouchableOpacity>}

答案 11 :(得分:0)

这对我有用。无需排除任何内容。我只是使用mockito-core而不是mockito-all

testCompile 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '3.0.0'
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '2.1'

答案 12 :(得分:0)

截至2020年7月,pom.xml中的以下依赖项对我有用:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.1</version>
</dependency>

使用此4.13 junit库和hamcrest,在断言时使用hamcrest.MatcherAssert并引发异常- enter image description here

答案 13 :(得分:0)

对于 jUnit 4.12,以下依赖项组合解决了我的问题。

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
</dependency>
<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>