[java] IntelliJ 10.5에서 테스트를 실행할 때“NoSuchMethodError : org.hamcrest.Matcher.describeMismatch”가 표시됨

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'