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