Frage Hamcrest vergleicht Sammlungen


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?


76
2018-02-07 10:00


Ursprung


Antworten:


Wenn Sie behaupten wollen, dass die beiden Listen identisch sind, erschweren Sie die Dinge nicht mit Hamcrest:

assertEquals(expectedList, actual.getList());

Wenn Sie wirklich einen auftragsunabhängigen Vergleich durchführen möchten, können Sie den containsInAnyOrder varargs Methode und Werte direkt angeben:

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(Angenommen, Ihre Liste enthält String, eher, als Agent, für dieses Beispiel.)

Wenn Sie die gleiche Methode mit dem Inhalt von a aufrufen möchten List:

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

Ohne dies rufen Sie die Methode mit einem einzigen Argument auf und erstellen ein Matcher das erwartet, dass ein Iterable woher jedes Element ist ein List. Dies kann nicht verwendet werden, um eine Übereinstimmung zu erzielen List.

Das heißt, Sie können nicht übereinstimmen List<Agent> mit einem Matcher<Iterable<List<Agent>>, was dein Code versucht.


118
2018-02-07 13:21



Das Einzige, was ich @ Joes Antwort hinzufügen möchte, ist das toArray() Der Parameter ist hier redundant, so dass Sie einen auftragsunabhängigen Vergleich wie folgt schreiben können:

List<Long> actual = Arrays.asList(1L, 2L);
List<Long> expected = Arrays.asList(2L, 1L);
assertThat(actual, containsInAnyOrder(expected.toArray()));

33
2018-03-01 03:25



Um @ Joes Antwort zu ergänzen:

Hamcrest bietet Ihnen drei Hauptmethoden, um einer Liste zu entsprechen:

contains Überprüft, ob alle Elemente übereinstimmen, die die Reihenfolge übernehmen. Wenn die Liste mehr oder weniger Elemente enthält, schlägt sie fehl

containsInAnyOrder Überprüft, ob alle Elemente übereinstimmen, und es spielt keine Rolle, dass die Reihenfolge fehlschlägt, wenn die Liste mehr oder weniger Elemente enthält

hasItems Überprüft nur für die angegebenen Objekte, ob die Liste mehr enthält

hasItem Prüft nur für ein Objekt, egal ob die Liste mehr hat

Alle von ihnen können eine Liste von Objekten erhalten und verwenden equals Methode für Vergleich oder kann mit anderen Matchern wie @borjab erwähnt werden:

assertThat(myList , contains(allOf(hasProperty("id", is(7L)), 
                                   hasProperty("name", is("testName1")),
                                   hasProperty("description", is("testDesc1"))),
                             allOf(hasProperty("id", is(11L)), 
                                   hasProperty("name", is("testName2")),
                                   hasProperty("description", is("testDesc2")))));

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 ...)


10
2018-05-17 16:40



Bei vorhandenen Hamcrest-Bibliotheken (ab Version 2.0.0.0) müssen Sie die Collection.toArray () -Methode für Ihre Collection verwenden, um containsInAnyOrder Matcher zu verwenden. Viel schöner wäre es, dies als separate Methode zu org.hamcrest.Matchers hinzuzufügen:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(Collection<T> items) {
    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder((T[]) items.toArray());
}

Tatsächlich habe ich diese Methode zu meiner benutzerdefinierten Testbibliothek hinzugefügt und benutze sie, um die Lesbarkeit meiner Testfälle zu erhöhen (wegen weniger Ausführlichkeit).


6
2017-07-08 08:57



Für eine Liste von Objekten benötigen Sie möglicherweise Folgendes:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.hamcrest.Matchers.is;

@Test
@SuppressWarnings("unchecked")
public void test_returnsList(){

    arrange();

    List<MyBean> myList = act();

    assertThat(myList , contains(allOf(hasProperty("id",          is(7L)), 
                                       hasProperty("name",        is("testName1")),
                                       hasProperty("description", is("testDesc1"))),
                                 allOf(hasProperty("id",          is(11L)), 
                                       hasProperty("name",        is("testName2")),
                                       hasProperty("description", is("testDesc2")))));
}

Benutzen containsInAnyOrder wenn Sie die Reihenfolge der Objekte nicht überprüfen möchten.

P.S. Jede Hilfe zur Vermeidung der unterdrückten Warnung wird sehr geschätzt.


1
2018-03-09 19:00



Stellen Sie sicher, dass die Objects in deiner Liste haben equals() definiert auf ihnen. Dann

    assertThat(generatedList,is(equalTo(expectedList)));

funktioniert.


1
2017-10-12 16:47



Um zwei Listen mit der Reihenfolge zu vergleichen, die verwendet wird,

assertThat(actualList, contains("item1","item2"));

-3
2017-11-11 17:28