AssertEquals, wenn der Listeninhalt nicht geordnet ist [duplizieren]

7

Wie würden Sie Folgendes umgestalten, wenn die Produkte in beliebiger Reihenfolge zurückgegeben werden können?

%Vor%

Wenn es elegant mit Streams gemacht werden kann, dann bin ich offen für solche Vorschläge. Hamcrest Vorschläge sind ebenfalls willkommen.

    
Baz 10.03.2017, 09:10
quelle

7 Antworten

7

Beachten Sie, dass assertEquals auch direkt in Listen und Sets funktioniert. Dies ist viel weniger Tippen und es wird sehr klare Fehlermeldungen geben.

Wenn die Rückgabewerte keine Duplikate enthalten dürfen, sollten sie anstelle einer Liste ein Set zurückgeben. Wenn Sie die zu testende Funktion auf diese Weise ändern können, können Sie sie wie folgt testen:

%Vor%

Wenn dies keine Option ist, sollten Sie sowohl die erwarteten als auch die tatsächlichen Ergebnisse sortieren und diese vergleichen:

%Vor%

Schließlich könnten Sie Hamcrest Matcher verwenden (die Funktion containsInAnyOrder ist in org.hamcrest.collection.IsIterableContainingInAnyOrder ):

%Vor%     
Thirler 10.03.2017, 09:26
quelle
6

Ich würde empfehlen, AssertJ -

zu verwenden %Vor%

was Ihnen zusätzlich viele flüssigere Behauptungen gibt (besonders die Ausnahmebehandlung) auch ).

    
MD Sayem Ahmed 10.03.2017 09:19
quelle
3

Ich würde die Antwort von Abubakkar mit Hamcrest vergleichen

kombinieren %Vor%     
sruetti 10.03.2017 09:26
quelle
2

Sie können eine boolesche Bedingung mit Stream#anyMatch(Predicate filter) :

  

Gibt zurück, ob Elemente dieses Streams mit dem angegebenen Prädikat übereinstimmen. Das Prädikat darf nicht für alle Elemente ausgewertet werden, wenn dies nicht zur Bestimmung des Ergebnisses erforderlich ist. Wenn der Stream leer ist, wird false zurückgegeben und das Prädikat wird nicht ausgewertet.

%Vor%     
manouti 10.03.2017 09:17
quelle
1

In solchen Situationen bevorzuge ich assertJ. Vielleicht wird es befriedigend sein. Beispiel:

%Vor%     
K. Gol 10.03.2017 09:28
quelle
1

Sie können so etwas mit stream versuchen (ich gehe davon aus, dass Sie nur an getName interessiert sind, und ich habe hammcrest nicht verwendet, also einfach nur assertTrue verwenden):

%Vor%     
Abubakkar 10.03.2017 09:17
quelle
1

Wenn ich Hamcrest nicht kenne, wäre meine Lösung, jede Liste (oder Kopien davon, wenn es nicht akzeptabel ist, sie zu modifizieren) zu sortieren und dann zu bestätigen, dass sie gleich sind.

Stärke: Funktioniert auch, wenn doppelte Produkte in der Liste vorhanden sind (benötigt das gleiche Duplikat in der anderen Liste).

Sie können einen Stream verwenden, um die Namen aus der Produktliste zu extrahieren. einige der anderen Antworten zeigen bereits, wie.

    
Ole V.V. 10.03.2017 09:37
quelle

Tags und Links