代码之家  ›  专栏  ›  技术社区  ›  Caiz22

JUnit测试ArrayList元素是否重复

  •  3
  • Caiz22  · 技术社区  · 6 年前

    使用此方法,使用调用的方法getRandomInt中的随机值生成ArrayList。为了创建一个测试ArrayList不包含重复项的测试方法,我应该断言什么?

    public static int getRandom(int min, int max) {
    
        return random.nextInt((max - min) + 1) + min;
    }
    
    public static ArrayList<Integer> getRandomIntegers(int size, int min, int max) {
    
        ArrayList<Integer> number = new ArrayList<Integer>();
    
        while (number.size() < size) {
            int random = getRandom(min, max);
    
            if(!number.contains(random)) {
                number.add(random);
            }
        }
    
        return number;
    } 
    
    5 回复  |  直到 6 年前
        1
  •  4
  •   davidxxx    6 年前

    事实上,你必须坚持更多。
    要检查方法的实际行为,您确实应该从返回的列表中断言:

    • 该列表具有预期的大小

    Assert.assertEquals(size, list.size());

    • 该列表不包含dup

    Assert.assertEquals(new HashSet<Long>(list).size(), actualList.size());

    • 列表元素在传递到的最小-最大范围内。

    for (long v : list){ Assert.assertTrue(v " + " is not in the expected range", v >= min && v <= max); }

    正如M.le Rutte强调的那样,我还认为方法API返回 Set 而不是 List 因为元素的顺序不是预期的:数字是随机的。

    顺便说一句,您的实现效率不高。
    如果范围较大,并且请求的大小接近范围大小,则可以循环更多的内容。

        2
  •  1
  •   Fede Garcia    3 年前

    使用assertJ,这是直截了当的 common-assertions-for-java-collections-in-assertj

    @Test
    public void noDuplicatesTest(){
        List<Integer> numbers = Lists.newArrayList(1, 52, 12, 39, 45, 98, 100, 565, 6, 13);
        assertThat(numbers).doesNotHaveDuplicates();
    }
    
        3
  •  0
  •   Bohemian    6 年前

    你可以把你的元素放入一个集合,然后比较大小。

    assert new HashSet(list).size() == list.size()
    
        4
  •  0
  •   zlakad    6 年前

    另一种方法是填补你的空缺 ArrayList 具有 Integers 从最小到最大,然后打电话 Collections.shuffle(aList) .

        5
  •  0
  •   Dishonered    6 年前

    你可以这样做,以检查是否没有重复,

    assertEquals(number.size(),number.stream().distinct().collect(Collectors.toList()).size());
    

    哪里 number 是你的arrayList。 用这个

    import static junit.framework.Assert.assertEquals