2011-04-06 5 views
80

JUnit 4.8이 Hamcrest matchers와 어떻게 작동하는지 이해할 수 없습니다. org.hamcrest.CoreMatchersjunit-4.8.jar 안에 정의 된 일부 matcher가 있습니다. 동시에 다른 일치는 hamcrest-all-1.1.jarorg.hamcrest.Matchers입니다. 그럼 어디로 가야합니까? 명시 적으로 hamcrest JAR을 프로젝트에 포함시키고 JUnit에서 제공하는 matcher를 무시합니까?JUnit과 Hamcrest를 함께 사용하는 방법?

특히, 나는 empty() matcher에 관심이있어이 항아리에서 찾을 수 없습니다. 다른 뭔가가 필요해? :)

철학 질문 : 왜 JUnit은 원래 hamcrest 라이브러리를 사용하도록 권장하지 않고 org.hamcrest 패키지를 자체 배포판에 포함 시켰는가?

답변

46

junit은 Matcher를 사용하는 assertThat()이라는 새로운 검사 assert 메서드를 제공하며보다 읽기 쉬운 testcode와 더 나은 오류 메시지를 제공해야합니다.

여기에는 junit에 포함 된 일부 핵심 matcher가 있습니다. 기본 테스트를 위해 이것들부터 시작할 수 있습니다.

더 많은 matchers를 사용하려면 직접 작성하거나 hamcrest lib를 사용하십시오.

package com.test; 

import static org.hamcrest.Matchers.empty; 
import static org.hamcrest.Matchers.is; 
import static org.junit.Assert.assertThat; 

import java.util.ArrayList; 
import java.util.List; 

import org.junit.Test; 

public class EmptyTest { 
    @Test 
    public void testIsEmpty() { 
     List myList = new ArrayList(); 
     assertThat(myList, is(empty())); 

    } 
} 

(나는 내 ​​buildpath에서 hamcrest-all.jar을 포함)

+2

정확히'org.hamcrest.Matchers.empty()'가 어디에 있습니까? JAR 파일에 대한 링크를 제공해 주시겠습니까? – yegor256

+0

여기에서 모두 찾을 수 있습니다 : http://code.google.com/p/hamcrest/ 및 hamcrest-all.jar 다운로드 : http://code.google.com/p/hamcrest/downloads/detail? name = hamcrest-all-1.2.jar & can = 2 & q = – cpater

+1

Maven Central 리포지토리에서 hamcrest 1.2 [가요?] (http://code.google.com/p/hamcrest/issues/detail?id=12)처럼 보입니다. 그건 내가 직면 한 문제 야 : ( – yegor256

24

정확하지 않게, 당신의 질문에 대답하지만 당신에게 :

다음의 예는 ArrayList의에 빈 정규를 사용하는 방법을 보여줍니다 유창한 어설 션 API 인 FEST-Assert을 사용해야합니다. Hamcrest와 경쟁 중이지만 정적 가져 오기가 하나만 있으면 훨씬 간편한 API를 사용할 수 있습니다.

package com.test; 
import java.util.ArrayList; 
import java.util.List; 
import org.junit.Test; 
import static org.fest.assertions.Assertions.assertThat; 

public class EmptyTest { 
    @Test 
    public void testIsEmpty() { 
     List myList = new ArrayList(); 
     assertThat(myList).isEmpty(); 
    } 
} 

편집 : 메이븐 좌표 : 여기 FEST를 사용 cpater 에서 제공하는 코드는 JUnit을 사용하는 우리를 격려하는 대신 자신의 분포에 org.hamcrest 패키지를 포함하는 이유

<dependency> 
    <groupId>org.easytesting</groupId> 
    <artifactId>fest-assert</artifactId> 
    <version>1.4</version> 
    <scope>test</scope> 
</dependency> 
+0

참으로 재미 있어요! – yegor256

+3

방금 ​​내 주장 라이브러리를 바꿨습니다. 나는 hamcrest에 상당히 만족했습니다. junit에 문제가있는 포함 항목과 일부 테스트 (수집 및 제네릭 포함)를 작성하기가 힘들어서 FEST와 사랑에 빠졌습니다! 공유해 주셔서 감사합니다. – Guillaume

+4

Bump - FEST가 이제 2.0x까지입니다. https://github.com/alexruiz/fest-assert-2.x/wiki –

3

원래 hamcrest 도서관?

assertThat이 JUnit의 일부가되기를 원했기 때문입니다. 따라서 Assert 클래스는 org.hamcrest.Matcher 인터페이스를 가져와야하며 JUnit이 Hamcrest에 종속되거나 Hamcrest의 일부 (적어도 일부)를 포함하지 않는 한이를 수행 할 수 없습니다. 그리고 JUnit은 종속성없이 사용할 수 있도록 일부를 포함하는 것이 더 쉽다고 생각합니다.

48

1.2보다 크거나 같은 버전의 Hamcrest를 사용하는 경우 junit-dep.jar을 사용해야합니다. 이 항아리에는 Hamcrest 클래스가 없으므로 클래스 로딩 문제를 피할 수 있습니다.

JUnit 4.11 이후 junit.jar 자체에는 Hamcrest 클래스가 없습니다. 더 이상 junit-dep.jar은 필요 없습니다.

+2

JUnit 4.12의 경우처럼 더 이상 junit-dep.jar가 없습니다. 그럴까요? 그렇다면 우리는 독립형 Hamcrest 1.3 병을 사용하겠습니까? –

+1

두 가지 질문에 대한 답변 : 예. –

17

또한 JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5를 사용하는 경우 mockito-all을 사용하지 마십시오. Hamcrest 핵심 수업이 포함되어 있습니다. 대신 mockito-core를 사용하십시오. 아래 설정 작동 : 버전이 모든 시간을 변경

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.3</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.mockito</groupId> 
    <artifactId>mockito-core</artifactId> 
    <version>1.9.5</version> 
    <scope>test</scope> 
    <exclusions> 
     <exclusion> 
      <artifactId>hamcrest-core</artifactId> 
      <groupId>org.hamcrest</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.1.1</version> 
    <scope>test</scope> 
    <exclusions> 
     <exclusion> 
      <artifactId>hamcrest-core</artifactId> 
      <groupId>org.hamcrest</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
4

때문에, 나는 사람들 12 월 2, 2014, http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in-a-maven-project-junit-mockito-hamcrest-assertj.html의 지시가 나를 위해 일한 것을 알 수 있도록 게시하도록하겠습니다. 나는,하지만 AssertJ을 사용하지 않은 단지이 :

<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.9.5</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> 
<dependency> 
    <groupId>org.objenesis</groupId> 
    <artifactId>objenesis</artifactId> 
    <version>1.3</version> 
    <scope>test</scope> 
</dependency> 
0

모두의 JUnit-4.12와의 JUnit - 출발지 - 4.10가 Hamcrest 종속성 각 .xml 파일에 따라.

추가 조사 결과 .xml 파일에서 종속성이 있지만 jar의 소스와 클래스가 있음을 보여줍니다. build.gradle의 의존성을 배제하는 방법 인 것처럼 보인다. 모든 것을 깨끗하게 유지하기 위해 테스트해라.

그냥 f.y.i.

+0

두 번째 단락을 이해할 수 없습니다. 네가 쓸 작정의 말을 빠뜨린 것 같아? –

관련 문제