有时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()
将匹配器作为参数,而不是键和值的精确值。如果您需要对每个键和值进行相等性测试以外的东西,这可能很有用。