Próbuję porównać 2 listy:
assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));
Ale pomysł
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)
Jak mam to napisać?
containsInAnyOrder
wymaga, aby wszystkie elementy były obecne, aby pierwsze twierdzenie zakończyło się niepowodzeniem. Sprawdź,hasItems
czy chcesz sprawdzić, czy są obecne przynajmniej te elementy.actual.getList()
zdarzy się"item1", "item3", "item2"
, że zawiera , test przejdzie pomyślnie i być może chcesz się upewnić, że zawiera on tylko wymienione elementy ... W takim przypadku możesz użyćassertThat(actual.getList().size(), equalTo(2));
przed zawartością zawieraInAnyOrder, w ten sposób upewniasz się, że obie listy mają taką samą zawartość.hasItems
. Dodatkowa kontrola jest tutaj niepotrzebna. Zobacz komentarz do Tima powyżej, a także Czym różnią się elementy hasItems, zawiera i zawiera w zamówieniu Hamcrest?*expectedList.toTypedArray()
) podczas przekazywania tablicy jako varargs!Krótsza wersja odpowiedzi @ Joe bez zbędnych parametrów.
źródło
Aby uzupełnić odpowiedź @ Joe:
Hamcrest zapewnia trzy główne metody dopasowania listy:
contains
Sprawdza dopasowanie wszystkich elementów biorąc pod uwagę kolejność, jeśli lista zawiera mniej lub więcej elementów, zakończy się niepowodzeniemcontainsInAnyOrder
Sprawdza dopasowanie wszystkich elementów i nie ma znaczenia kolejność, jeśli lista zawiera mniej lub więcej elementów, zakończy się niepowodzeniemhasItems
Sprawdza tylko określone obiekty, nie ma znaczenia, czy lista ma ich więcejhasItem
Sprawdza tylko jeden obiekt, nie ma znaczenia, czy lista ma więcejWszystkie z nich mogą otrzymać listę obiektów i użyć
equals
metody do porównania lub mogą być mieszane z innymi dopasowaniami, takimi jak wspomniany @borjab: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 ...)
źródło
Z istniejącymi bibliotekami Hamcrest (od wersji 2.0.0.0) jesteś zmuszony użyć metody Collection.toArray () na swojej kolekcji, aby użyć dopasowującego includeInAnyOrder. O wiele przyjemniej byłoby dodać to jako oddzielną metodę do org.hamcrest.Matchers:
W rzeczywistości dodałem tę metodę do mojej własnej biblioteki testów i użyłem jej do zwiększenia czytelności moich przypadków testowych (ze względu na mniejszą szczegółowość).
źródło
Upewnij się, że zdefiniowano na nich
Object
s na liścieequals()
. NastępniePracuje.
źródło
Aby uzyskać listę obiektów, możesz potrzebować czegoś takiego:
Użyj opcji containsInAnyOrder, jeśli nie chcesz sprawdzać kolejności obiektów.
PS Każda pomoc w uniknięciu zniesionego ostrzeżenia będzie naprawdę mile widziana.
źródło
Aby porównać dwie listy z zachowaną kolejnością użycia,
źródło
actualList
zawiera elementy wewnątrz elementucontains
dopasowującego, co nie powiedzie się, jeśli elementy nie są w tej samej kolejności, a także zakończy się niepowodzeniem, jeśli zawiera więcej elementów lub ich brakuje.