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

能否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:40:33