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를 사용하고 있다고 생각합니다. 사용중인 hamcrest.MatcherAssert를 어떻게 찾습니까 (예 : hamcrest.MatcherAssert에 사용중인 jar 파일)? AFAICT, 클래스 경로에서 유일한 햄 크레스트 병은 1.3.RC2입니다.
IntelliJ IDEA는 자체 JUnit 또는 Hamcrest 사본을 사용합니까?
IntelliJ가 사용하는 런타임 CLASSPATH를 어떻게 출력합니까?
답변
hamcrest jar가 JUnit jar 보다 가져 오기 순서에서 더 높은지 확인하십시오 .
JUnit 에는 org.hamcrest.Matcher
대신 사용되는 자체 클래스가 있습니다.
또한 hamcrest 클래스가없는 JUnit 인 junit-dep-4.10.jar을 다운로드하여 사용할 수도 있습니다.
mockito에는 햄 크레스트 클래스도 포함되어 있으므로 이동 / 재주문해야 할 수도 있습니다.
답변
이 문제 는 이미 사용되지 않는 클래스 경로에 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>
답변
문제는 잘못이 있다고했다 hamcrest.Matcher
,하지 hamcrest.MatcherAssert
, 클래스가 사용되었다. 그것은 junit-4.8 의존성에서 가져온 것입니다. 내 의존성 중 하나가 지정했습니다.
테스트하는 동안 어떤 소스에서 어떤 종속성 (및 버전)이 포함되는지 확인하려면 다음을 실행하십시오.
mvn dependency:tree -Dscope=test
답변
다음은 오늘 가장 정확해야합니다. junit 4.11은 hamcrest-core에 의존하므로 hamcrest 1.1이 포함되어 있기 때문에 mockito-all을 전혀 사용할 수 없도록 지정할 필요는 없습니다.
<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
코드를 마무리하기 위해 사용자 정의 또는 유틸리티 메소드를 작성할 수 있습니다 .
답변
나는 이것이 오래된 스레드라는 것을 알고 있지만 나를 위해 문제를 해결 한 것은 내 build.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'