Иногда Map.equals()
достаточно. Но иногда вы не знаете, что типы Map
s возвращаются кодом в тестах, поэтому вы не знаете, будет ли .equals()
правильно сравнить карту неизвестного типа, возвращаемую кодом с построенной вами картой. Или вы не хотите связывать свой код с такими тестами.
Кроме того, построение карты по отдельности, чтобы сравнить результат с ним ИМХО не очень элегантна:
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));
Я предпочитаю использовать 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))
));
Я должен определить hasSize()
себя:
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");
}
};
}
И есть еще один вариант hasEntry()
, который принимает в качестве параметров параметры вместо точных значений ключа и значения. Это может быть полезно, если вам нужно что-то другое, кроме проверки равенства каждого ключа и значения.
Я также попробовал 'containsAll' и др. Некоторое время назад это выглядело неэффективно - видимо, hamcrest немного ненадежен :-( –
Есть ли причина, по которой вы не можете использовать '.equals()' реализации карты? –
Ah - I hadn 't понял, что коллекции делают правильные сравнения .equals(). Всегда ли это было так? Это облегчает жизнь! Спасибо! –