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