2009-07-07 4 views
54

왜 컴파일되지 않습니까? 오, 어떻게해야합니까? 코멘트에서 복사왜이 코드는 Hamcrest의 hasItems를 사용하려고 시도하지 않습니까?

import static org.junit.Assert.assertThat; 
import static org.junit.matchers.JUnitMatchers.hasItems; 

ArrayList<Integer> actual = new ArrayList<Integer>(); 
ArrayList<Integer> expected = new ArrayList<Integer>(); 
actual.add(1); 
expected.add(2); 
assertThat(actual, hasItems(expected)); 

오류 : 당신은 intArrayList<Integer>을 비교하는

cannot find symbol method assertThat(java.util.ArrayList<java.lang.Integer>, org.hamcreset.Matcher<java.lang.Iterable<java.util.ArrayList<java.lang.Integer>>>) 

답변

12

. 정확한 비교는 다음과 같습니다

... 
assertThat(actual, hasItem(2)); 

- 편집 -

미안 해요, 내가 잘못 읽었습니다. 어쨌든, 당신이 원하는 hasItems의 서명은 다음과 같습니다

public static <T> org.hamcrest.Matcher<java.lang.Iterable<T>> hasItems(T... elements) 

즉, 그것은 가변 인자를 받아들입니다. ArrayList<T>이 호환되는지 확실하지 않습니다. 단지 여기에서 추측 할 수 있습니다. 쉼표로 표시된 예상 목록에서 각 항목을 보내보십시오.

assertThat(actual, hasItems(2,4,1,5,6)); 

- 편집 2 -

그냥 여기 내 코멘트를 붙여, 사용하지 않고 당신이 원하는에 대한 동등한 표현, Hamcrest있다 :

assertTrue(actual.containsAll(expected)); 
+0

으로 사용하는 것입니다. (hasItems, hasItem이 아님) – ripper234

+0

그래서 hamcrest는 단순히 두 개의 콜렉션 비교를 지원하지 않습니까? (실제 아이템 목록이 없습니다. 컬렉션 수를 비교해야하는 0에서 999까지의 숫자 목록을 만들고 있습니다.) – ripper234

+0

나는 당신에게 대답 할 수 없다, 나는 문서에 기초하여 이것을 말하고있다. 그러나 원하는 것을 할 수있는 더 쉬운 방법이 있습니다 ... assertTrue를 사용하십시오 (실제. 포함). – freitass

2

그 오류 메시지가 하나처럼 보인다 javac 컴파일러에 의해 생성됩니다. 나는 hamcrest를 사용하여 작성된 코드가 javac에서 컴파일되지 않는다는 것을 과거에 발견했습니다. 이클립스 컴파일러에서 똑같은 코드가 잘 컴파일 될 것이다.

나는 Hamcrest의 제네릭이 javac이 처리 할 수없는 제네릭의 코너 경우를 실행하고 있다고 생각합니다.

+0

와우, 재미있다. 그래서 위의 코드가 합법적 인 자바 코드라고 말하고 있습니까? – ripper234

+2

아니요, javac이 때때로 합법적 인 java 코드를 거부하고 hamcrest가 그 일반적인 원인이라고 말하고 있습니다. – skaffman

3

는 정규 서명을 만족

assertThat(actual, hasItems(expected.toArray(new Integer[0]))); 

을보십시오. 이클립스가 없으므로 이것이 작동하지 않을 수 있습니다.

21

hasItems는 컬렉션에 일부 아이템이 포함되어 있는지 확인합니다. 2 개의 컬렉션이 동일하지는 않은지 확인합니다. 보통 평등성 주장을 사용하면됩니다. 그러니 assertEquals (A, B) 또는 사용 또는

import static org.junit.Assert.assertThat; 
import static org.hamcrest.CoreMatchers.is; 

ArrayList<Integer> actual = new ArrayList<Integer>(); 
ArrayList<Integer> expected = new ArrayList<Integer>(); 
actual.add(1); 
expected.add(2); 
assertThat(actual, is(expected)); 

assertThat는이 Iterable을 특정 순서

import static org.junit.Assert.assertThat; 
import static org.hamcrest.Matchers.contains; 

ArrayList<Integer> actual = new ArrayList<Integer>(); 
actual.add(1); 
actual.add(2); 
assertThat(actual, contains(1, 2)); // passes 
assertThat(actual, contains(3, 4)); // fails 

당신이 걱정하지 않는 경우의 항목이 포함되어 있는지 확인 Matcher를이 포함되어 사용 순서 대신 containsInAnyOrder을 사용하십시오. 만약 ArrayList를 함유 한 소자 어레이를 전달하는

hasItems(new ArrayList<Integer>[]{expected}); 

:

0
ArrayList<Integer> expected = new ArrayList<Integer>(); 
expected.add(1); 
expected.add(2); 
hasItems(expected); 

hasItems (T..t)는 컴파일러에 의해 확장되고있다. ArrayList를 Array로 변경하면 코드가 작동합니다.코드가 이클립스에서 컴파일 않을 때 이런 경우

hasItems(1, 2); 
1

하지만 javac의 오류 입력 명시 적으로 매개 변수 예를 들어, 제공함으로써 도움 hamcrest을하시기 바랍니다 보여줍니다

Integer[] expected = new Integer[]{1, 2}; 
hasItems(expected); 

가 확대됩니다 Matchers.hasItem은()

2

난 그냥 같은 문제를 가로 질러 와서 다음과 같은 트릭은 나를 위해 일한 : import static org.hamcrest.Matchers.hasItems

  • 은 (경로를 구축 클래스 경로에 JUnit을하기 전에 hamcrest 라이브러리가

    • 사용 -> 순서 수출)
  • 52

    나 자신을 위해이 문제를 해결하려고합니다. 그것을 해결하기에 충분한 정보를 주셨습니다.

    당신은 (원시) Matcher를에 hasItems의 반환 값을 변환하여 컴파일을 설득 할 충분한 컴파일러, 예를 들어 줄 수 :

    ArrayList<Integer> actual = new ArrayList<Integer>(); 
    ArrayList<Integer> expected = new ArrayList<Integer>(); 
    actual.add(1); 
    expected.add(2); 
    assertThat(actual, (Matcher) hasItems(expected)); 
    

    이런 경우에 다른 사람은 여전히 ​​고통을 ...

    편집 추가 : 투표 결과에도 불구하고 Arend가 아래 지적했듯이이 대답은 잘못되었습니다. 올바른 대답은 hamcrest 기대되는 한, 정수의 배열로 예상 설정하는 것입니다 : 당신이 새 버전의 JUnit의 hamcrest를 교체하려고하면

    ArrayList<Integer> actual = new ArrayList<Integer>(); 
        ArrayList<Integer> expected = new ArrayList<Integer>(); 
        actual.add(1); 
        expected.add(2); 
        assertThat(actual, hasItems(expected.toArray(new Integer[expected.size()]))); 
    
    +0

    오래 전에이 소스 코드를 잃어 버렸기 때문에 (이 회사를 두 번 옮겼습니다)이 답변을 테스트 해 보지 못했습니다 만, 이것을 부활시키기 위해 엄지 손가락을 줬습니다. – ripper234

    +1

    팁이 좋습니다. Hamcrest가 collection matcher 제네릭을 대신에 으로 변경 한 이후 assertThat()을 모든 컬렉션 정규자와 함께 사용하는 유일한 "직선적 인"방법으로 보입니다. – Frans

    +0

    'hasItems'도 순서와 일치하기를 바랍니다. 그것은 그렇지 않은 것처럼 보입니다. –

    2

    이 오류를 얻을 수 있습니다. 예를 들어 hamcrest 1.3과 함께 junit-dep를 사용하려면 jUnit 대신 hamcrest에서 assertThat을 사용해야합니다.

    그래서 해결책은 내가 여러 항목을 비교하고있어

    import static org.hamcrest.MatcherAssert.assertThat;

    대신

    import static org.junit.Assert.assertThat;

    관련 문제