【问题标题】:Compare 2 List<String> if they contain same elements in any order [JUnit - Asset]比较 2 List<String> 是否以任何顺序包含相同的元素 [JUnit - Asset]
【发布时间】:2017-10-17 10:31:15
【问题描述】:

我想通过使用 JUnit 创建单元测试来测试是否正确生成了某些字符串列表。

我有 2 个字符串列表(我的代码中的一个列表是私有静态最终列表,比如说 list1),它们具有相同的元素(相同的元素可以相乘),但顺序不同:

List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("c","a","b");
assertThat(list1 , containsInAnyOrder(list2));

这不起作用,junit 测试返回第一个元素不匹配。

我可能使用containsInAnyOrder 方法错误。

containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers) 

我不知道如何实现这个Matcher

我不想使用这种类型的函数,因为它只适用于少量元素:

containsInAnyOrder(T... items)

【问题讨论】:

    标签: java list junit matcher


    【解决方案1】:

    您可以先对List 进行排序,然后比较排序后的Lists。

    List<String> list1 = Arrays.asList("a","b","c");
    List<String> list2 = Arrays.asList("c","a","b",);
    Collections.sort(list1);
    Collections.sort(list2);
    assertEquals( list1, list2 ); // true
    

    【讨论】:

      【解决方案2】:

      这取决于您是否希望有重复。

      如果没有重复 1 简单选项是使用 Set - 使用 equals() 和使用 assertEquals( setA, setB ); 两个 Set 彼此相等

      有更多“原始”方式(对每个唯一值使用 HashMap 并比较每个值的重复)来执行此操作,但对于您要查找的内容,请检查 this answer

      【讨论】:

        【解决方案3】:

        我在tutorial about unit tests 中找到了这段代码:

        assertThat(list1, containsInAnyOrder("c", "b", "a"));    
        

        测试列表的完整方法:

        @Test
        public void testAssertList() {
        
            List<String> actual = Arrays.asList("a", "b", "c");
            List<String> expected = Arrays.asList("a", "b", "c");
        
            //All passed / true
        
            //1. Test equal.
            assertThat(actual, is(expected));
        
            //2. If List has this value?
            assertThat(actual, hasItems("b"));
        
            //3. Check List Size
            assertThat(actual, hasSize(3));
        
            assertThat(actual.size(), is(3));
        
            //4.  List order
        
            // Ensure Correct order
            assertThat(actual, contains("a", "b", "c"));
        
            // Can be any order
            assertThat(actual, containsInAnyOrder("c", "b", "a"));
        
            //5. check empty list
            assertThat(actual, not(IsEmptyCollection.empty()));
        
            assertThat(new ArrayList<>(), IsEmptyCollection.empty());
        
        }
        

        您的测试可能失败了,因为list1 实际上并不包含list2,而是包含list2 中的元素

        【讨论】:

          【解决方案4】:

          到目前为止,这是最通用的解决方案,没有集合、附加排序、...

          assertThat(list1, containsInAnyOrder(list2.toArray()));
          

          但我还是想知道如何实现这个调用:

          containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
          

          【讨论】:

          • 试试containsInAnyOrder(isIn(list2)) 不会处理重复条目,因为containsInAnyOrder 不关心重复。
          • “InAnyOrder”不是针对列表的元素,而是针对匹配器。就是说,给定多个匹配器,每个元素可以满足任意顺序的任何匹配器。
          猜你喜欢
          • 2012-09-11
          • 2012-08-31
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 2021-06-25
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          相关资源
          最近更新 更多