Angenommen, ich möchte eine Methode mit dieser Signatur testen:
List<MyItem> getMyItems();
Angenommen, es MyItem
handelt sich um ein Pojo mit vielen Eigenschaften, auf die "name"
über zugegriffen werden kann getName()
.
Ich möchte nur überprüfen, ob die List<MyItem>
oder eine Iterable
der beiden MyItem
Instanzen zwei Instanzen enthält , deren "name"
Eigenschaften die Werte "foo"
und haben "bar"
. Wenn andere Eigenschaften nicht übereinstimmen, interessieren mich die Zwecke dieses Tests nicht wirklich. Wenn die Namen übereinstimmen, ist dies ein erfolgreicher Test.
Ich möchte, dass es wenn möglich einzeilig ist. Hier ist eine "Pseudo-Syntax", wie ich sie gerne machen würde.
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Wäre Hamcrest gut für so etwas? Wenn ja, was genau wäre die Hamcrest-Version meiner obigen Pseudosyntax?
quelle
Es ist nicht besonders Hamcrest, aber ich denke, es ist erwähnenswert, hier zu erwähnen. Was ich in Java8 ziemlich oft benutze, ist wie folgt:
(Bearbeitet zu Rodrigo Manyaris leichter Verbesserung. Es ist etwas weniger ausführlich. Siehe Kommentare.)
Es ist vielleicht etwas schwieriger zu lesen, aber ich mag den Typ und die Refactoring-Sicherheit. Es ist auch cool, um mehrere Bohneneigenschaften in Kombination zu testen. zB mit einem Java-ähnlichen && Ausdruck im Filter Lambda.
quelle
Assertj ist gut darin.
Ein großes Plus für assertj im Vergleich zu hamcrest ist die einfache Verwendung der Code-Vervollständigung.
quelle
AssertJ bietet eine hervorragende Funktion in
extracting()
: Sie könnenFunction
s übergeben, um Felder zu extrahieren. Es bietet eine Überprüfung zur Kompilierungszeit.Sie können die Größe auch einfach zuerst festlegen.
Es würde geben:
containsExactlyInAnyOrder()
behauptet, dass die Liste unabhängig von der Reihenfolge nur diese Werte enthält.Um zu behaupten, dass die Liste diese Werte unabhängig von der Reihenfolge enthält, aber auch andere Werte enthalten kann, verwenden Sie
contains()
:Als Randnotiz:
List
Um mehrere Felder aus Elementen von a zu aktivieren, tun wir dies mit AssertJ, indem wir die erwarteten Werte für jedes Element in einetuple()
Funktion einschließen :quelle
Solange Ihre Liste eine konkrete Klasse ist, können Sie einfach die Methode includes () aufrufen, solange Sie Ihre Methode equals () in MyItem implementiert haben.
Angenommen, Sie haben einen Konstruktor implementiert, der die Werte akzeptiert, für die Sie eine Bestätigung erstellen möchten. Mir ist klar, dass dies nicht in einer einzelnen Zeile steht, aber es ist nützlich zu wissen, welcher Wert fehlt, anstatt beide gleichzeitig zu überprüfen.
quelle
AssertJ 3.9.1 unterstützt die direkte Verwendung von Prädikaten in
anyMatch
Methoden.Dies ist im Allgemeinen ein geeigneter Anwendungsfall für beliebig komplexe Zustände.
Für einfache Bedingungen bevorzuge ich
extracting
Methode (siehe oben), da die daraus resultierende iterierbare Prüfung die Wertüberprüfung mit besserer Lesbarkeit unterstützen kann. Beispiel: Es kann eine spezielle API wie diecontains
Methode in Frank Neblungs Antwort bereitstellen . Oder Sie könnenanyMatch
es später trotzdem aufrufen und Methodenreferenzen wie z"searchedvalue"::equals
. Es können auch mehrere Extraktoren inextracting
Methode gebracht werden, deren Ergebnis anschließend mit überprüft wirdtuple()
.quelle