Czasami wystarczy Map.equals()
. Ale czasami nie wiesz, że typy kodu są testowane, więc nie wiesz, czy .equals()
poprawnie porówna tę mapę nieznanego typu zwróconą przez kod z mapą stworzoną przez ciebie. Lub nie chcesz wiązać swojego kodu z takimi testami.
Dodatkowo budowy mapy oddzielnie porównać wynik z niej jest IMHO niezbyt elegancki:
Map<MyKey, MyValue> actual = methodUnderTest();
Map<MyKey, MyValue> expected = new HashMap<MyKey, MyValue>();
expected.put(new MyKey(1), new MyValue(10));
expected.put(new MyKey(2), new MyValue(20));
expected.put(new MyKey(3), new MyValue(30));
assertThat(actual, equalTo(expected));
Wolę wykorzystaniem machers:
import static org.hamcrest.Matchers.hasEntry;
Map<MyKey, MyValue> actual = methodUnderTest();
assertThat(actual, allOf(
hasSize(3), // make sure there are no extra key/value pairs in map
hasEntry(new MyKey(1), new MyValue(10)),
hasEntry(new MyKey(2), new MyValue(20)),
hasEntry(new MyKey(3), new MyValue(30))
));
muszę zdefiniować hasSize()
sobie:
public static <K, V> Matcher<Map<K, V>> hasSize(final int size) {
return new TypeSafeMatcher<Map<K, V>>() {
@Override
public boolean matchesSafely(Map<K, V> kvMap) {
return kvMap.size() == size;
}
@Override
public void describeTo(Description description) {
description.appendText(" has ").appendValue(size).appendText(" key/value pairs");
}
};
}
I istnieje inny wariant hasEntry()
, który przyjmuje parametry dopasowania jako parametry zamiast dokładnych wartości klucza i wartości. Może to być przydatne, jeśli potrzebujesz czegoś innego niż testowanie równości każdego klucza i wartości.
Próbowałem również 'containsAll' et al. jakiś czas temu i wydawało się, że nie działa - najwyraźniej hamcrest jest jeszcze trochę niewiarygodny :-( –
Czy istnieje powód, dla którego nie można użyć '.equals()' z implementacji mapy? –
Ah - I hadn nie zdawałem sobie sprawy, że kolekcje robią poprawne porównania .equals() Czy zawsze tak było? To znacznie ułatwia życie! Dziękuję! –