Ich versuche 2 Listen zu vergleichen:
assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));
Aber Idee
java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
(no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
Wie soll ich es schreiben?
containsInAnyOrder
erfordert, dass alle Elemente vorhanden sind, damit die erste Behauptung fehlschlägt. Sehen Sie,hasItems
wenn Sie überprüfen möchten , dass zumindest diese Elemente vorhanden sind.actual.getList()
dies"item1", "item3", "item2"
der Fall ist, besteht der Test und Sie möchten möglicherweise sicherstellen, dass er nur die aufgelisteten Elemente enthält ... In diesem Fall können Sie verwendenassertThat(actual.getList().size(), equalTo(2));
Auf diese Weise stellen Sie vor dem includesInAnyOrder sicher, dass beide Listen den gleichen Inhalt haben.hasItems
. Die zusätzliche Prüfung ist hier nicht erforderlich. Siehe den Kommentar zu Tim oben und auch Wie unterscheiden sich Hamcrests hasItems, enthält und enthältInAnyOrder?*expectedList.toTypedArray()
) hinzuzufügen, wenn Sie ein Array als varargs übergeben!Kürzere Version von @ Joes Antwort ohne redundante Parameter.
quelle
Zur Ergänzung von @ Joes Antwort:
Hamcrest bietet Ihnen drei Hauptmethoden, um eine Liste abzugleichen:
contains
Überprüft, ob alle Elemente übereinstimmen, und zählt die Reihenfolge. Wenn die Liste mehr oder weniger Elemente enthält, schlägt dies fehlcontainsInAnyOrder
Überprüft, ob alle Elemente übereinstimmen, und es spielt keine Rolle, in welcher Reihenfolge die Liste mehr oder weniger Elemente enthält, schlägt fehlhasItems
Überprüft nur die angegebenen Objekte, es spielt keine Rolle, ob die Liste mehr enthälthasItem
Überprüft nur ein Objekt, es spielt keine Rolle, ob die Liste mehr enthältAlle von ihnen können eine Liste von Objekten erhalten und eine
equals
Vergleichsmethode verwenden oder mit anderen Matchern wie @borjab gemischt werden, die erwähnt werden:http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains (E ...) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html #containsInAnyOrder (java.util.Collection) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#hasItems (T ...)
quelle
Bei vorhandenen Hamcrest-Bibliotheken (ab Version 2.0.0.0) müssen Sie die Collection.toArray () -Methode für Ihre Sammlung verwenden, um den IncludeInAnyOrder Matcher zu verwenden. Weitaus schöner wäre es, dies als separate Methode zu org.hamcrest.Matchers hinzuzufügen:
Tatsächlich habe ich diese Methode zu meiner benutzerdefinierten Testbibliothek hinzugefügt und sie verwendet, um die Lesbarkeit meiner Testfälle zu verbessern (aufgrund der geringeren Ausführlichkeit).
quelle
Stellen Sie sicher, dass die
Object
s in Ihrer Liste daraufequals()
definiert sind. Dannfunktioniert.
quelle
Für die Liste der Objekte benötigen Sie möglicherweise Folgendes:
Verwenden Sie includesInAnyOrder, wenn Sie die Reihenfolge der Objekte nicht überprüfen möchten.
PS Jede Hilfe, um die Warnung zu vermeiden, die unterdrückt wird, wird sehr geschätzt.
quelle
Um zwei Listen mit der Reihenfolge zu vergleichen, verwenden Sie:
quelle
actualList
die Elemente imcontains
Matcher enthält. Dies schlägt fehl, wenn die Elemente nicht in derselben Reihenfolge vorliegen, und schlägt auch fehl, wenn es mehr Elemente enthält oder eines fehlt.