時には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));
私はマッチャーを使用することを好みます:
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()
、キーと値の正確な値の代わりに、マッチャーをパラメーターとして受け取る別のバリアントがあります。これは、すべてのキーと値の等価性テスト以外の何かが必要な場合に役立ちます。