AssertEquals 2 목록은 순서를 무시합니다.
정말 간단한 질문이어야한다고 생각합니다. 하지만 어떻게 든 Google에서 답을 찾을 수 없습니다.
2 개의 문자열 목록이 있다고 가정합니다. 첫 번째는 "문자열 A"및 "문자열 B"를 포함 하고 두 번째 항목에는 "문자열 B"및 "문자열 A"가 포함됩니다 (순서 차이에 유의). JUnit 으로 테스트하여 정확히 동일한 문자열이 포함되어 있는지 확인 하고 싶습니다 .
순서를 무시하는 문자열의 동등성을 확인하는 어설 션이 있습니까? 주어진 예에서 org.junit.Assert.assertEquals는 AssertionError를 발생시킵니다.
java.lang.AssertionError: expected:<[String A, String B]> but was:<[String B, String A]>
해결 방법은 먼저 목록을 정렬 한 다음이를 어설 션에 전달하는 것입니다. 하지만 내 코드는 가능한 한 간단하고 깔끔하기를 원합니다.
저는 Hamcrest 1.3 , JUnit 4.11 , Mockito 1.9.5를 사용 합니다.
Hamcrest를 사용한다고 말씀 하셨듯이 Matchers 컬렉션 중 하나를 선택하겠습니다.
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;
public class CompareListTest {
@Test
public void compareList() {
List<String> expected = Arrays.asList("String A", "String B");
List<String> actual = Arrays.asList("String B", "String A");
assertThat("List equality without order",
actual, containsInAnyOrder(expected.toArray()));
}
}
JUnit의 assertTrue 와 함께 List.containsAll 을 사용 하여 첫 번째 목록에 두 번째 목록의 모든 요소가 포함되어 있는지 확인하고 그 반대의 경우도 마찬가지입니다.
assertTrue(first.size() == second.size() &&
first.containsAll(second) && second.containsAll(first));
다음은 2 차 복잡성을 피하는 솔루션입니다 (목록을 여러 번 반복). 이것은 Apache Commons CollectionUtils 클래스를 사용하여 목록의 빈도 수 자체에 대한 각 항목의 맵을 만듭니다. 그런 다음 단순히 두 개의지도를 비교합니다.
Assert.assertEquals("Verify same metrics series",
CollectionUtils.getCardinalityMap(expectedSeriesList),
CollectionUtils.getCardinalityMap(actualSeriesList));
나는 또한 방금 여기에서 요청 된 것을 정확히 수행한다고 주장하는 CollectionUtils.isEqualCollection을 발견했습니다 ...
Collections.sort(excepted);
Collections.sort(actual);
assertEquals(excepted,actual);
Roberto Izquierdo의 솔루션에는 일반적으로 2 차 복잡성이 있습니다. HashSet의 솔루션에는 항상 선형 복잡성이 있습니다.
assertTrue(first.size() == second.size() &&
new HashSet(first).equals(new HashSet(second)));
파티에 늦었지만 Junit만을 사용하는 솔루션입니다. 어떤 생각이라도 환영합니다.
List<String> actual = new ArrayList<>();
actual.add("A");
actual.add("A");
actual.add("B");
List<String> expected = new ArrayList<>();
actual.add("A");
actual.add("B");
actual.add("B");
//Step 1: assert for size
assertEquals(actual.size(), expected.size());
//Step 2: Iterate
for(String e: expected){
assertTrue(actual.contains(e));
actual.remove(e);
}
junit-addons jar에 포함 된 ListAssert 를 사용할 수 있습니다 .
ListAssert.assertEquals(yourList, Arrays.asList(3, 4, 5));
빠른 수정을 위해 두 가지 방법을 모두 확인합니다.
assertTrue(first.containsAll(second));
assertTrue(second.containsAll(first));
그리고 동일한 요소의 수가 다른 상황 (예 : 1, 1, 2 및 1, 2, 2)으로 시도해 보았습니다. 오 탐지가 발생하지 않았습니다.
AssertJ를 사용 containsExactlyInAnyOrder()하거나 containsExactlyInAnyOrderElementsOf()필요한 것은 다음과 같습니다.
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
public class CompareListTest {
@Test
public void compareListWithTwoVariables() {
List<String> expected = Arrays.asList("String A", "String B");
List<String> actual = Arrays.asList("String B", "String A");
Assertions.assertThat(actual)
.containsExactlyInAnyOrderElementsOf(expected);
}
@Test
public void compareListWithInlineExpectedValues() {
List<String> actual = Arrays.asList("String B", "String A");
Assertions.assertThat(actual)
.containsExactlyInAnyOrder("String A", "String B");
}
}
참고 URL : https://stackoverflow.com/questions/22807328/assertequals-2-lists-ignore-order
'Nice programing' 카테고리의 다른 글
| 목록이 있는지 확인하는 가장 빠른 방법 (0) | 2020.11.17 |
|---|---|
| SQL Server에서이 오류가 발생하는 이유 : 'id'열에 NULL 값을 삽입 할 수 없습니다. (0) | 2020.11.17 |
| Split ()에서 첫 번째 항목 가져 오기 (0) | 2020.11.17 |
| android.dexOptions.incremental 속성은 더 이상 사용되지 않습니다. (0) | 2020.11.17 |
| 파이썬에 '멀티 맵'구현이 있습니까? (0) | 2020.11.17 |