programing

JUnit 4 비교 세트

javaba 2023. 1. 19. 21:08
반응형

JUnit 4 비교 세트

어떻게 간결하게 평등을 주장할 것인가?Collection요소, 특히SetJUnit 4에서요?

이 두 가지는 단언할 수 있습니다.Sets는 서로 동등하며, 이로 인해 networks를 호출합니다.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는 같은 크기이며 같은 요소를 포함합니다.

아파치가 다시 구했다.

assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));

마법처럼 작동한다.왜 그랬는지는 모르겠지만, 나는 다음과 같은 컬렉션과 함께 발견했어요.assertEquals(coll1, coll2)항상 효과가 있는 것은 아닙니다.실패했을 경우, 세트로부터 2개의 컬렉션을 지원받았습니다.비록 수집품들이 동등하다는 것을 확실히 알면서도 햄크레스트도 주니트도 동등하다고 말하지 않을 것이다.Collection Utils를 사용하면 완벽하게 동작합니다.

햄크레스트 포함:

assertThat(s1, is(s2));

단도직입적으로 말하다:

assertEquals(s1, s2);

NB: 콘크리트 세트클래스의 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 Collection Utils의 예는 기능하지만 솔리드 어설션 확장의 팩키지도 있습니다.

제가 봤을 때

ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});

접근법은 읽기 쉽고 디버깅이 용이합니다(모든 컬렉션은 Array()를 지원하므로 Array Assert 메서드를 사용하는 것은 충분히 간단합니다.

물론 여기서 단점은 junitx가 추가 항아리 파일이나 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);  
}  

햄크레스트 사용:

assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));

이것은, 세트의 데이터 타입이 다른 경우에서도 동작해, 에러만 보고하는 것이 아니라, 그 차이에 대해 보고합니다.

난 한스-피터 슈퇴르의 해결책을 좋아해하지만 나는 그것이 꽤 정확하지 않다고 생각한다.슬프게containsInAnyOrder를 받아들이지 않습니다.Collection비교할 수 있습니다.그러니까 이게...CollectionMatchers:

assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))

Import는 다음과 같습니다.

import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;

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"를 구분할 수 없습니다.그러나 실제로는 테스트를 쉽고 빠르게 작성하는 것이 가장 중요하다고 생각합니다.그렇지 않으면 많은 개발자들이 압박을 받지 않고는 그렇게 하지 않을 것입니다.)

언급URL : https://stackoverflow.com/questions/2313229/junit-4-compare-sets

반응형