测试列表<List<T>> 包含任意顺序的相同项目

问题描述 投票:0回答:3

我想比较两个以任意顺序包含相同元素的

List<List<String>>
。他们不平等。

// expectedResult 
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

另一个是

// result
[
  ["eat", "tea", "ate"], 
  ["bat"], 
  ["tan", "nat"]
]

我应该使用什么测试方法(来自哪些库)来比较 **elements 中的元素而不进行排序?**

我尝试过,但没有成功。

import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;

assertThat(expectedResult, containsInAnyOrder(result));
java junit hamcrest
3个回答
1
投票

您可以尝试使用Apache Commons

public static boolean isEqualCollection(集合a,集合b)

当给定集合包含具有完全相同基数的完全相同元素时返回 true。

也就是说,对于 a 或 b 中的每个元素 e,当且仅当 a 中 e 的基数等于 b 中 e 的基数。

参数:

  • a - 第一个集合,不能为空
  • b - 第二个集合,不能为空

返回:true当且仅当集合包含具有相同基数的相同元素。

import org.apache.commons.collections4.CollectionUtils;
import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class TestSO {

    @Test
    public void testLists() {
        List<List<String>> list = Arrays.asList(Arrays.asList("ate", "eat", "tea"), Arrays.asList("nat", "tan"), Arrays.asList("bat"));
        List<List<String>> sameList = Arrays.asList(Arrays.asList("ate", "eat", "tea"), Arrays.asList("bat"), Arrays.asList("nat", "tan"));
        List<List<String>> differentList = Arrays.asList(Arrays.asList("ate", "eat"), Arrays.asList("bat"), Arrays.asList("nat", "tan"));

        Assert.assertTrue(CollectionUtils.isEqualCollection(list, sameList));
        Assert.assertFalse(CollectionUtils.isEqualCollection(list, differentList));
    }

}

0
投票

方法

.containsAll()
适用于集合,不适用于集合的集合。

基本上我最终比较了第一个集合的每个元素,然后使用

.containsAll()
作为嵌套集合。

import org.junit.Assert;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

    @Test
    public void groupAnagramsTest() {
        List<List<String>> expectedResult = Arrays.asList(Arrays.asList("bat"), Arrays.asList("nat", "tan"), Arrays.asList("ate", "eat", "tea"));
        List<List<String>> result = Arrays.asList(Arrays.asList("bat"), Arrays.asList("tan", "nat"), Arrays.asList("tea", "eat", "ate"));

        // to test the equality without order, 
        // assert that all elements are contained in the compared list and vice versa
        for (int i = 0; i < result.size(); i++) {
            Assert.assertTrue(expectedResult.get(i).containsAll(result.get(i)));
            Assert.assertTrue(result.get(i).containsAll(expectedResult.get(i)));
        }
    }

注意:两者外部列表的顺序是相同的。不然不行。


0
投票

以任意顺序比较两个

List<List<String>>
以及内部列表中的任意顺序(缺少或重复的元素除外),基本上是为了比较它们的字谜词:

List<List<String>> actual = List<List<String>> expected = List.of(
        List.of("bat"),
        List.of("tea", "ate", "eat"),
        List.of("tan", "nat")
);
List<List<String>> expected = List.of(
        List.of("nat", "tan"),
        List.of("bat"),
        List.of("ate", "eat", "tea")
);

Set<Integer> actualHash = new HashSet<>();
Set<Integer> expectedHash = new HashSet<>();
for (int i = 0; i < actual.size(); i++) {
    actualHash.add(new HashSet<>(actual.get(i)).hashCode());
    expectedHash.add(new HashSet<>(expected.get(i)).hashCode());
}
Assertions.assertThat(actualHash.hashCode()).hasSameHashCodeAs(expectedHash.hashCode());

我在这里使用了

org.assertj.core.api.Assertions
,但它可以是任何断言。

© www.soinside.com 2019 - 2024. All rights reserved.