Manchmal Map.equals()
ist genug. Aber manchmal wissen Sie nicht, die Typen von Map
s wird von Code unter Tests zurückgegeben, so dass Sie nicht wissen, ob .equals()
wird die Karte des unbekannten Typs ordnungsgemäß von Code mit Karte von Ihnen erstellt vergleichen. Oder Sie möchten Ihren Code nicht mit solchen Tests binden.
Zusätzlich separat eine Karte Konstruktion damit das Ergebnis zu vergleichen ist IMHO nicht sehr elegant:
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));
ich lieber mit Macher:
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))
));
ich hasSize()
selbst definieren muß:
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");
}
};
}
Und es gibt eine andere Variante von hasEntry()
, die Matcher als Parameter anstelle der exakten Werte von Schlüssel und Wert verwendet. Dies kann nützlich sein, wenn Sie für jeden Schlüssel und Wert etwas anderes als die Gleichheitsprüfung benötigen.
Ich habe auch versucht 'containsAll' et al. Vor einiger Zeit und es schien nicht zu funktionieren - anscheinend ist Hamcrest ein bisschen unzuverlässig noch :-( –
Gibt es einen Grund, warum Sie die '.equals()' der Map-Implementierung nicht verwenden können? –
Ah - ich hadn 'realisierte, dass Sammlungen richtige .equals() - Vergleiche machen. War das schon immer so? Das macht das Leben viel einfacher! Danke! –