如何在Set的Assertj Collection中验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Set的Assertj Collection中验证相关的知识,希望对你有一定的参考价值。

我有返回记录列表的方法。每条记录都设置为字段。

public class R {
    public final Set s;
}

我有所有预期的Set列表 - 如:

Set<String> set1 = new HashSet<String>(); set1.add("s1");
Set<String> set2 = new HashSet<String>(); set1.add("s2");
Set<String> set3 = new HashSet<String>(); set1.add("s3");

我想使用AssertJ(版本3.11.1)以简单的方式验证响应List<R>包含所有已定义的Set或者至少来自这些集合的所有元素的聚合等于来自集合set1, set2, set3的元素的聚合

注意:以下解决方案不起作用:

Set allElements = new HashSet<String>();
allElements.addAll(set1);
allElements.addAll(set2);
allElements.addAll(set3);

List<R> result = foo();
org.assertj.core.api.Assertions.assertThat(result)
    .extracting(record -> record.s)
    .containsOnly(allElements);

我有:

java.lang.AssertionError: 
Expecting:
  <[["s1.1", "s1.2"],
    ["s2.1", "s2.2"],
    ["s3.1", "s3.2"]]>
to contain only:
  <[["s1.1",
    "s1.2",
    "s2.1",
    "s2.2",
    "s3.1",
    "s3.2"]]>
答案

看起来containsExactlyInAnyOrderElementsOf就是答案

解决方案是:

Set<Set<String>> referralSet = new HashSet<>();
referralSet.add(set1);
referralSet.add(set2);
referralSet.add(set3);

org.assertj.core.api.Assertions.assertThat(result)
        .extracting(record -> record.s)
        .containsExactlyInAnyOrderElementsOf(referralSet);
另一答案

看起来像flatExtracting的用例,尝试类似:

.assertThat(result).flatExtracting(record -> record.s)
                   .containsExactlyInAnyOrderElementsOf(referralSet);

以上是关于如何在Set的Assertj Collection中验证的主要内容,如果未能解决你的问题,请参考以下文章

java 中 collection 和set ,list

单元测试断言利器 AssertJ

走进Java接口测试之流式断言库AssertJ

使用 assertJ 命令 (TestNG + assertJ Swing) 调用时,swing 应用程序会立即打开和关闭

在java测试中强制执行assertj

AssertJ摘要