JUnit 测试 ArrayList 元素不重复

Cai*_*z22 7 java junit

使用此方法使用调用方法 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;
} 
Run Code Online (Sandbox Code Playgroud)

Fed*_*cia 7

使用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();
}
Run Code Online (Sandbox Code Playgroud)


dav*_*xxx 6

事实上,你必须断言的不止这些。
要检查该方法的实际行为,您确实应该从返回的列表中断言:

  • 该列表具有预期的大小

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

  • 该列表不包含重复项

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 返回 a 更有意义,Set因为List元素的顺序不是预期的:数字是随机的。

附带说明一下,您的实施效率不高。
如果范围很大并且请求的大小接近范围大小,则循环的次数可能会超出所需的次数。