In einem Komponententest möchte ich überprüfen, dass zwei Listen die gleichen Elemente enthalten. Die zu testende Liste besteht aus einer Liste von Person
-Objekten, wobei ein Feld vom Typ String
extrahiert wird. Die andere Liste enthält String
Literale.
Oft findet man das folgende Code-Snippet, um diese Aufgabe zu erledigen (siehe diese Antwort ):
%Vor% Die Person
-Klasse ist definiert als:
Im obigen Beispiel wird die Liste der Personen (oder Personen) in eine Liste von Strings umgewandelt, die Java 8-Techniken verwenden, und der Vergleich wird auf altmodische Weise durchgeführt.
Nun frage ich mich, ob es einen direkteren oder effizienteren Weg gibt, den Vergleich mit anderen Java-8-Anweisungen zu machen, zum Beispiel allMatch()
oder etwas Predicate<T>
oder etwas anderes.
Der Code Ihrer Frage spiegelt nicht, was Sie in den Kommentaren beschreiben. In den Kommentaren sagen Sie, dass alle Namen vorhanden sein sollten und die Größe übereinstimmen sollte, mit anderen Worten, nur die Reihenfolge kann anders sein.
Ihr Code ist
%Vor% Es fehlt ein Test für die Größe von people
, dh Duplikate sind möglich. Des Weiteren ist die Verwendung von containsAll
, das zwei List
s kombiniert, sehr ineffizient. Es ist viel besser, wenn Sie einen Sammlertyp verwenden, der Ihre Absicht widerspiegelt, d. H. Keine Duplikate hat, sich nicht um eine Bestellung kümmert und eine effiziente Suche hat:
Bei dieser Lösung müssen Sie nicht manuell auf die Größe testen. Es wird bereits vorausgesetzt, dass die Gruppen die gleiche Größe haben, wenn sie übereinstimmen. Nur die Reihenfolge kann unterschiedlich sein.
Es gibt eine Lösung, bei der die Namen von persons
nicht erfasst werden müssen:
funktioniert aber nur, wenn expectedNames
eine temporäre Menge ist, die aus der statischen Sammlung erwarteter Namen erstellt wurde. Sobald Sie sich entschließen, Ihre statische Sammlung durch Set
zu ersetzen, benötigt die erste Lösung keinen temporären Satz und letzterer hat keinen Vorteil mehr.
Wenn die Anzahl der Elemente gleich sein muss, dann wäre es besser, Sets zu vergleichen:
%Vor% Die equals
-Methode für korrekt implementierte Mengen sollte in der Lage sein, verschiedene Arten von Mengen zu vergleichen: Sie prüft nur, ob der Inhalt derselbe ist (ignorieren Sie die Reihenfolge des Kurses).
Die Verwendung von assertEquals
ist bequemer, da im Falle eines Fehlers eine Fehlermeldung die Zeichenfolgendarstellung Ihres Sets enthält.
Tags und Links java-8 lambda comparison java-stream