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

时间:2019-11-19 10:57:29

标签: assertj

我正在尝试确定我是否可以编写一个比到目前为止想出的代码更简洁的代码。

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

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是类型Set的{​​{1}}。此类型包含ProduktUebersichtView部分中列出的字段。
我想知道是否有更好的方法(我有信心)更简洁地编写这些断言。
该集合包含四个对象。其中三个是相同的对象类型,一个是不同的类型,但包含几乎所有字段。
理想情况下,我希望有两个extracting语句;前三个案例一个,最后一个案例。

我尽量不要使问题中的代码过于混乱。如果您想了解更多信息,请告诉我;我会尽力提供。

1 个答案:

答案 0 :(得分:1)

根据我对问题的了解,您可以针对前3种情况通过“ PRODUKT_BASIS”进行过滤,并只需编写一个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(), ...));