jUnit의 CollectionAssert?


답변:


125

JUnit 4.4를 사용 assertThat()하면 Hamcrest 코드 와 함께 사용할 수 있습니다 (걱정하지 마십시오. JUnit과 함께 제공되며 추가 필요 없음 .jar).

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

이 접근 방식을 사용하면 어설 션이 실패 할 때 자동으로 좋은 설명을 얻을 수 있습니다.


1
오, 나는 hamcrest가 그것을 junit 배포판으로 만들었다는 것을 깨닫지 못했다. 냇가!
skaffman

l이 항목 ( "foo", "bar")으로 구성되어 있지만 다른 항목이 존재하지 않는다고 주장하고 싶다면 쉬운 구문이 있습니까?
ripper234 2009-07-06

위의 코드 스 니펫을 사용하고 추가 assertTrue (l.size () == 2)
aberrant80

4
Meh, 못 생겼다. NUnit에서 CollectionAssert.AreEqual (Collection expected, Collection actual);
ripper234 2009-07-06

1
Google은 내가 찾고 있던 또 다른 Stackoverflow 답변을 찾았습니다!
Mykola Golubyev

4

직접적으로는 아닙니다. jUnit (및 기타 테스트 프레임 워크)과 잘 통합되는 풍부한 일치 규칙 세트를 제공하는 Hamcrest 사용을 제안합니다.


어떤 이유로 든 컴파일되지 않습니다 ( stackoverflow.com/questions/1092981/hamcrests-hasitems 참조 ) : ArrayList <Integer> actual = new ArrayList <Integer> (); ArrayList <Integer> 예상 = new ArrayList <Integer> (); actual.add (1); expected.add (2); assertThat (실제, hasItems (예상));
ripper234


2

Joachim Sauer의 솔루션은 좋지만 결과에 확인하려는 일련의 기대치를 이미 가지고있는 경우 작동하지 않습니다. 이는 결과를 비교하려는 테스트에서 이미 생성되거나 일정한 기대가 있거나 결과에 병합 될 것으로 예상되는 여러 기대가있을 때 발생할 수 있습니다. 그래서 그 대신 매처 (matcher)를 사용하는 당신은 사용할 수 있습니다 List::containsAllassertTrue예를 들어 :

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

언제든지 hasItems(expected1.toArray(new String[expected1.size()])). 더 나은 실패 메시지를 제공합니다.
meustrus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.