我正在尝试测试我编写的类,并使用Guava-testlib MapInterfaceTest
从Java实现Map。当我尝试运行实现MapInterfaceTest
的MapTest时,所有测试都失败了(几乎是52/56),尽管我所做的只是从LinkedHashMap
调用函数。
为什么会这样?番石榴接口测试如何实际工作以及如何修复我的代码?调试器在这里并没有真正的帮助。
例如,我有:
public void testEqualsForEmptyMap() {
final Map<K, V> map;
try {
map = makeEmptyMap();
} catch (UnsupportedOperationException e) {
return;
}
assertEquals(map, map);
assertEquals(makeEmptyMap(), map);
assertEquals(Collections.emptyMap(), map);
assertFalse(map.equals(Collections.emptySet()));
//noinspection ObjectEqualsNull
assertFalse(map.equals(null));
}
我的makeEmptyMap方法:
@Override
protected Map<Integer, String> makeEmptyMap() throws UnsupportedOperationException {
return new MyMap<Integer, String>();
}
我的地图:
private final HashMap<K, V> entries;
public MyMap() {
entries = new LinkedHashMap<K, V>();
}
此测试在此失败:assertEquals(makeEmptyMap(), map);
答案 0 :(得分:3)
考虑到MyMap
类中可见的代码,失败是很正常的:因为您没有覆盖Object#equals
方法,所以使用默认实现,它依赖于内存引用相等(Object#equals
使用==
)实现。
因此,JVM会尝试检查两个对象是否都是内存中的相同实例,而这些实例并非如此。而你的测试失败了。
更一般地说,您必须使用(有时)非平凡代码来实现Map
的完整界面。因此,除非您确切知道自己的工作以及执行操作的原因,否则请更好地重用现有的Map实现。