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

时间:2019-09-10 21:50:02

标签: java junit hamcrest

我想比较以任何顺序包含相同元素的两个List<List<String>>。他们不平等。

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

另一个是

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

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

我尝试失败了。

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

assertThat(expectedResult, containsInAnyOrder(result));

2 个答案:

答案 0 :(得分:1)

您可以尝试使用 Apache Commons

  

public static boolean isEqualCollection(Collection a, Collection b)

     

如果给定Collections包含具有完全相同基数的完全相同元素,则返回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));
    }

}

答案 1 :(得分: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)));
        }
    }

注意:外部List的顺序在两者之间是相同的。否则它将无法正常工作。