能否通过AbstractIterableAssert断言提取结果仅存在重复项?
实现方法
针对你用AssertJ提取字段后断言结果仅包含重复项的需求,这里有几种实用的实现方式:
方式一:断言所有元素与第一个元素一致
这种方式直接验证提取后的所有字段值都和第一个元素相同,简单直观:
var extractResult = assertThat(someList).extracting("someField").asList(); assertThat(extractResult).isNotEmpty() .allMatch(value -> value.equals(extractResult.get(0)));
如果需要确保至少存在重复项(即集合大小≥2),可以追加hasSizeGreaterThan(1):
var extractResult = assertThat(someList).extracting("someField").asList(); assertThat(extractResult).hasSizeGreaterThan(1) .allMatch(value -> value.equals(extractResult.get(0)));
方式二:通过去重后的集合大小验证
利用流的distinct()方法去重后,断言结果集合大小为1(说明所有元素都是重复的):
assertThat(someList).extracting("someField") .satisfies(fieldValues -> { assertThat(fieldValues).hasSizeGreaterThan(1); // 确保存在重复 assertThat(fieldValues.stream().distinct()).hasSize(1); });
方式三:自定义断言(复用性更高)
如果需要多次使用这个断言逻辑,可以封装成自定义的AssertJ断言:
public static <T> Condition<Iterable<T>> containsOnlyDuplicates() { return new Condition<>(iterable -> { List<T> list = StreamSupport.stream(iterable.spliterator(), false) .collect(Collectors.toList()); return list.size() > 1 && list.stream().distinct().count() == 1; }, "contains only duplicate elements"); }
使用时直接调用:
assertThat(someList).extracting("someField").is(containsOnlyDuplicates());
注意事项
- 如果允许集合中只有一个元素(严格来说不算重复),可以去掉
hasSizeGreaterThan(1)的断言; - 确保字段值的
equals()方法已正确实现,否则断言会失效。
内容的提问来源于stack exchange,提问作者Hans Wurst
相关产品推荐
相关产品推荐

