有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在集合的Assertj集合中进行验证

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

public class R {
    public final Set s;
}

我有所有预期集合的列表,如:

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>包含所有定义的集合,或者至少这些集合中所有元素的聚合等于集合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"]]>

共 (2) 个答案

  1. # 1 楼答案

    看来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);
    
  2. # 2 楼答案

    看起来像是flatExtracting的一个用例,请尝试以下操作:

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