AssertJ:断言具有字段(和值)的对象数组包含(等于)另一个具有字段(和值)的对象数组

AssertJ: Asserting that a an array of objects with fields (and values) contains (equals) another array of objects with fields (and values)

我想弄清楚我是否可以编写一个比我到目前为止想出的代码更简洁的程序代码。

我先分享代码片段和代码片段后的一些解释:

assertThat(produktUebersichtViews.size()).isEqualTo(4);

assertThat(produktUebersichtViews)
    .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName",
        "erledigungsFrist", "uebersichtTyp", "referencedProduktBasis")
    .containsAnyOf(
        tuple(ehbEinrichtung.getObjectId(), ehbEinrichtung.getProduktBasisTyp(),
            ehbEinrichtung.getName(), ehbEinrichtung.getZustand().name(),
            ehbEinrichtung.getBearbeiter(), ehbEinrichtung.getBearbeiterName(),
            ehbEinrichtung.getErledigungsFrist(), "PRODUKT_BASIS",
            ehbEinrichtung.getReferencedProduktBasis()
        )
    );

assertThat(produktUebersichtViews)
    .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName",
        "erledigungsFrist", "uebersichtTyp", "referencedProduktBasis")
    .containsAnyOf(
        tuple(ehbPerson.getObjectId(), ehbPerson.getProduktBasisTyp(), ehbPerson.getName(),
            ehbPerson.getZustand().name(), ehbPerson.getBearbeiter(),
            ehbPerson.getBearbeiterName(), ehbPerson.getErledigungsFrist(), "PRODUKT_BASIS",
            ehbPerson.getReferencedProduktBasis()
        )
    );

assertThat(produktUebersichtViews)
    .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName",
        "erledigungsFrist", "uebersichtTyp", "referencedProduktBasis")
    .containsAnyOf(
        tuple(ehbAbrechnung.getObjectId(), ehbAbrechnung.getProduktBasisTyp(),
            ehbAbrechnung.getName(), ehbAbrechnung.getZustand().name(),
            ehbAbrechnung.getBearbeiter(), ehbAbrechnung.getBearbeiterName(),
            ehbAbrechnung.getErledigungsFrist(), "PRODUKT_BASIS",
            ehbAbrechnung.getReferencedProduktBasis()
        )
    );

assertThat(produktUebersichtViews)
    .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName",
        "erledigungsFrist", "uebersichtTyp")
    .containsAnyOf(
        tuple(pruefbericht.getObjectId(),
            pruefbericht.getProduktErgebnisTyp(), pruefbericht.getName(),
            pruefbericht.getZustand().name(), pruefbericht.getBearbeiter(),
            pruefbericht.getBearbeiterName(), pruefbericht.getErledigungsFrist(),
            "PRODUKT_ERGEBNIS"
        )
    );

变量 produktUebersichtViews 是类型 ProduktUebersichtViewSet。此类型包含 extracting 部分中列出的字段。
我想知道是否有更好的方法(我相信有)可以更简洁地编写这些断言。
该集合包含四个对象;其中三个是相同的对象类型,一个是不同的类型但包含几乎所有字段。
理想情况下,我希望有两个 assertThat 语句;前三种情况一个,最后一种情况一个

我尽量不让问题中出现太多代码。如果您想了解更多信息,请告诉我;我会尽量提供。

根据我对问题的理解,您可以通过“PRODUKT_BASIS 过滤前 3 种情况,然后简单地写一个 contains 断言,例如:

assertThat(produktUebersichtViews)
      .filteredOn(p -> p.getUebersichtType().equals("PRODUKT_BASIS"))
      .extracting("objectId", "typ", "title", "status", "bearbeiter", "bearbeiterName",
                  "erledigungsFrist", "uebersichtTyp", "referencedProduktBasis")
       // not writing the full tuple ... 
      .contains(tuple(ehbEinrichtung.getObjectId(), ...),
                tuple(ehbPerson.getObjectId(), ...),
                tuple(ehbAbrechnung.getObjectId(), ...));