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

我正在使用JUnit-dep 4.10和Hamcrest 1.3.RC2。

我创build了一个如下所示的自定义匹配器:

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。 我怎么find哪个hamcrest.Matcher表明它正在使用(即哪个jar文件用于hamcrest.MatcherAssert)? AFAICT,在我的课程path中唯一的Hamcrestjar子是1.3.RC2。

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

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

确保Hamcrest jar的import顺序比JUnit jar高。

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

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

mockito也有其中的hamcrest类,所以你可能需要移动\重新sorting

当你的类path上有mockito-all时,这个问题也会出现,这已经被弃用了。

如果可能的话,只需包含mockito-core

Mavenconfiguration混合junit,mockito和hamcrest:

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

问题是那个错误的hamcrest.Matcher ,而不是hamcrest.MatcherAssert ,正在使用类。 这是从一个junit-4.8依赖关系中,我的一个依赖被指定。

要查看在testing时从什么源中包含哪些依赖项(和版本),请运行:

 mvn dependency:tree -Dscope=test 

以下应该是今天最正确的。 请注意,junit 4.11取决于hamcrest核心,所以你不需要指定,所有mockito都不能使用,因为它包括 (不依赖于)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> 

经过一番努力,这对我来说很有效

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

尝试

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

代替

expectMessage(message)

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

对我来说有效的是从junittesting编译中排除了hamcrest组。

这里是我的build.gradle的代码:

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

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

我知道这不是最好的答案,但如果你不能得到类path的工作,这是一个计划B的解决scheme。

在我的testing类path中,我为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_(); } 

我知道这是一个古老的线程,但是什么解决了我的问题是添加以下到我的build.gradle文件。 如上所述, mockito-all存在兼容性问题

可能有用的post :

 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'