Search code examples
assertj

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


I am trying to figure out if I can write a terser program code than the one I came up with until now.

I start with sharing the code snippet and some explanation after the code snippet:

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"
        )
    );

The variable produktUebersichtViews is a Set of a type ProduktUebersichtView. This type contains the fields listed in the extracting part.
I wonder if there are better ways (I'm confident there are) to write these assertions more concisely.
The set contains four objects; three of them are the same object type, one is a different type but containing almost all fields.
Ideally I would like to have two assertThat statements; one for the first three cases and one for the last case.

I tried not to clutter too much code in the question. Please let me know if you would like to have more information; I will try to provide.


Solution

  • From my understanding of the problem you could filter by "PRODUKT_BASIS for the first 3 cases and simply write one contains assertion, something like:

    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(), ...));