You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit测试:如何断言生成的ArrayList元素无重复

如何用JUnit断言验证随机整数列表无重复元素?

先把你提供的工具方法整理成可读性更好的代码,方便大家理解上下文:

import java.util.ArrayList;
import java.util.Random;

public class RandomUtils {
    private static final Random random = new Random();

    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<>();
        while (number.size() < size) {
            int randomNum = getRandom(min, max);
            if (!number.contains(randomNum)) {
                number.add(randomNum);
            }
        }
        return number;
    }
}

接下来给你几种实用的JUnit断言方案,从简洁到灵活都有:

方案一:利用Set的去重特性(最省心)

Set的核心规则就是不允许重复元素,所以我们可以把生成的ArrayList转成HashSet,然后对比两者的大小。如果列表没有重复元素,Set的大小会和原列表的size完全一致。

JUnit 4/JUnit 5通用测试代码示例:

import org.junit.jupiter.api.Test;
import java.util.HashSet;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class RandomUtilsTest {

    @Test
    void testGetRandomIntegers_NoDuplicates() {
        int testSize = 10;
        int min = 1;
        int max = 20; // 注意:max - min + 1必须≥testSize,否则原方法会无限循环

        ArrayList<Integer> randomList = RandomUtils.getRandomIntegers(testSize, min, max);
        HashSet<Integer> uniqueSet = new HashSet<>(randomList);

        // 断言列表大小和去重后的Set一致,说明无重复
        assertEquals(testSize, uniqueSet.size(), "生成的随机列表包含重复元素");
    }
}

方案二:手动遍历检查(适合深入验证)

如果你想更直观地跟踪每一个元素的重复性,可以手动遍历列表,用临时集合记录已出现的元素,遇到重复就触发断言失败。

示例代码:

import org.junit.jupiter.api.Test;
import java.util.HashSet;
import static org.junit.jupiter.api.Assertions.assertFalse;

public class RandomUtilsTest {

    @Test
    void testGetRandomIntegers_NoDuplicates_ManualCheck() {
        int testSize = 10;
        int min = 1;
        int max = 20;

        ArrayList<Integer> randomList = RandomUtils.getRandomIntegers(testSize, min, max);
        HashSet<Integer> seenElements = new HashSet<>();

        for (Integer num : randomList) {
            // 如果当前元素已在集合中,说明重复,断言直接失败
            assertFalse(seenElements.contains(num), "发现重复元素: " + num);
            seenElements.add(num);
        }
    }
}

方案三:用AssertJ断言库(语法更优雅)

如果你的项目引入了AssertJ库,它提供了语义化极强的断言方法,一行代码就能搞定验证:

先确保Maven依赖(Gradle同理):

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.24.2</version>
    <scope>test</scope>
</dependency>

测试代码会非常简洁:

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

public class RandomUtilsTest {

    @Test
    void testGetRandomIntegers_NoDuplicates_AssertJ() {
        int testSize = 10;
        int min = 1;
        int max = 20;

        ArrayList<Integer> randomList = RandomUtils.getRandomIntegers(testSize, min, max);
        // 直接断言列表无重复元素
        assertThat(randomList).doesNotHaveDuplicates();
    }
}

重要提醒

测试时一定要保证max - min + 1 ≥ size,否则你的getRandomIntegers方法会因为找不到足够多的不重复随机数陷入无限循环,测试也会超时失败!

内容的提问来源于stack exchange,提问作者Caiz22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:42