我正在使用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?
答案 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)
答案 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>