Collection
요소, 특히 Set
JUnit 4 의 동등성을 어떻게 간결하게 주장 할 수 있습니까?
Collection
요소, 특히 Set
JUnit 4 의 동등성을 어떻게 간결하게 주장 할 수 있습니까?
답변:
두 Set
s가 서로 동일하다고 주장 하여 Set
equals()
메서드 를 호출 할 수 있습니다.
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
이 @Test
두 경우에 합격 Set
(S)가 동일한 크기 및 동일한 구성 요소를 포함한다.
equals
있고 hashCode
구현 되었습니까?
아파치 커먼즈를 다시 구출하십시오.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
매력처럼 작동합니다. 이유는 모르겠지만 컬렉션에서 다음 assertEquals(coll1, coll2)
이 항상 작동하는 것은 아닙니다. 나에게 실패한 경우에는 Sets가 지원하는 두 개의 컬렉션이 있습니다. hamcrest와 junit은 내가 확실히 알았음에도 불구하고 컬렉션이 동등하다고 말하지 않았습니다. CollectionUtils를 사용하면 완벽하게 작동합니다.
와 hamcrest :
assertThat(s1, is(s2));
평범한 주장으로 :
assertEquals(s1, s2);
NB : t 구체적인 세트 클래스 의 equals () 메소드 가 사용됩니다.
특히 흥미로운 경우는
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
과
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
지금까지 내가 본 유일한 해결책은 둘 다 세트로 변경하는 것입니다.
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
또는 요소별로 비교할 수 있습니다.
배열 기반의 추가 방법으로 ... junitx에서 정렬되지 않은 배열 어설 션 사용을 고려할 수 있습니다. Apache CollectionUtils 예제가 작동하지만 여기에도 견고한 어설 션 확장 패키지가 있습니다.
나는
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
접근 방식은 훨씬 더 읽기 쉽고 디버깅이 가능할 것입니다 (모든 컬렉션은 toArray ()를 지원하므로 ArrayAssert 메서드를 사용하는 것이 충분히 쉬워야합니다.
물론 여기서 단점은 junitx가 추가 jar 파일 또는 maven 항목이라는 것입니다.
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Hamcrest 사용 :
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
이는 세트의 데이터 유형이 서로 다른 경우에도 작동하며 실패하는 대신 차이를보고합니다.
List 또는 Set에 특정 값 집합이 포함되어 있는지 확인하려면 (이미 기존 컬렉션과 비교하는 대신) 종종 toString 컬렉션 메서드가 유용합니다.
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
이것은 예상되는 컬렉션을 처음 구성하고 실제 컬렉션과 비교하는 것보다 약간 짧으며 작성하고 수정하기 쉽습니다.
(분명히 이것은 특별히 깨끗한 방법이 아니며 "foo, bar"요소를 "foo"및 "bar"두 요소와 구별 할 수 없습니다. 그러나 실제로 테스트를 작성하는 것이 쉽고 빠르다는 것이 가장 중요하다고 생각합니다. , 그렇지 않으면 많은 개발자가 누르지 않고는 할 수 없습니다.)
나는 Hans-Peter Störr의 해결책을 좋아합니다. 그러나 그것은 옳지 않다고 생각합니다. 슬프게도 비교할 objetcs를 containsInAnyOrder
허용하지 않습니다 Collection
. 따라서 다음 Collection
과 Matcher
같아야합니다.
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
가져 오기는 다음과 같습니다.
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;