Niedawno korzystałem z biblioteki Hamcrest, aby napisać kilka testów i całkiem udanych, ale teraz muszę zrobić coś bardziej złożonego i zacząłem dostrzegać wiele trudności. Muszę nanieść i zweryfikować właściwości przedmiotów na mapie. Mój kod produkcyjny wygląda mniej więcej tak:Jak używać Hamcrest do sprawdzania elementów mapy
Map<String, List<MyItem>> map = new HashMap<String, List<MyItem>>();
map.put("one", Arrays.asList(new MyItem("One")));
map.put("two", Arrays.asList(new MyItem("Two")));
map.put("three", Arrays.asList(new MyItem("Three")));
Chcę napisać kilka kodów testowych, takich jak poniższe, ale nie kompiluje. Wygląda na to, że hasEntry Hamcresta jest sparametryzowane, podczas gdy hasItem i hasProperty oczekują tylko Object.
assertThat(map, Matchers.<String, List<MyItem>>hasEntry("one", hasItem(hasProperty("name", is("One")))));
Mój IDE (Eclipse) daje ten komunikat o błędzie: parametryczne metody <String, List<HamcrestTest.MyItem>>hasEntry(String, List<HamcrestTest.MyItem>)
typu Matchers
nie dotyczy argumentów (String, Matcher<Iterable<? super Object>>)
. Z jednej strony myślę, że Eclipse jest zdezorientowany z jakiej metody chciałem użyć, to powinien być hasEntry(org.hamcrest.Matcher<? super K> keyMatcher, org.hamcrest.Matcher<? super V> valueMatcher)
, a nie hasEntry(K key, V value)
.
Czy powinienem się poddać i pobrać przedmiot z mapy i ręcznie sprawdzić każdą nieruchomość? Czy istnieje czystszy sposób?
nie wierzę, to będzie rozwiązać ten błąd kompilacji, ponieważ 'hasEntry' zwróci' Matcher> 'zamiast wymaganego' dopasowujący > ' –
@JohnB: Wierz mi lub nie, ale spróbowałem i działa to dla mnie po prostu brzoskwiniowo. – t0mppa
Może źle. Dobra decyzja. –