我使用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,我的类路径中唯一的hamcrest jars是1.3.RC2。

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

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


当前回答

问题是戴错了膝盖骨。Matcher,不是hamcrest。MatcherAssert,类正在被使用。它是从junit-4.8依赖项中拉进来的,我的一个依赖项正在指定。

要在测试时查看来自哪个源的依赖项(和版本),请运行:

mvn dependency:tree -Dscope=test

其他回答

我知道这是一个旧线程,但解决我的问题是添加以下内容到我的构建。gradle文件。 如上所述,mockito-all存在兼容性问题

可能有用的职位:

testCompile ('junit:junit:4.12') {
    exclude group: 'org.hamcrest'
}
testCompile ('org.mockito:mockito-core:1.10.19') {
    exclude group: 'org.hamcrest'
}
testCompile 'org.hamcrest:hamcrest-core:1.3'

确保hamcrest罐在进口顺序上高于JUnit罐。

JUnit自带自己的org.hamcrest.Matcher类,这个类可能正在被使用。

您也可以下载并使用JUnit -dep-4.10.jar,它是没有hamcrest类的JUnit。

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

就我而言,我不得不从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>

尽管这是一个非常古老的问题 也许前面提到的许多想法解决了许多问题, 我仍然想与解决我的问题的社区分享解决方案。

我发现问题出在一个叫hasItem的函数上 我用它来检查json数组是否包含特定的项。 在我的例子中,我检查了类型为Long的值。

这就产生了问题。

不知何故,matcher在Long类型的值上有问题。 (我不太使用JUnit或Rest-Assured,所以idk。为什么, 但我猜返回的JSON-data只包含整数。)

为了解决这个问题,我做了如下的事情。 而不是使用:

long ID = ...;

...
.then().assertThat()
  .body("myArray", hasItem(ID));

你只需要转换为Integer。 工作代码是这样的:

long ID = ...;

...
.then().assertThat()
  .body("myArray", hasItem((int) ID));

这可能不是最好的解决方案, 但我只是想提一下,也可以因为错误/未知的数据类型而抛出异常。

Try

expect(new StringContains(message))

而不是

expectMessage(消息)

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