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
相关产品推荐
相关产品推荐

