如何使用 Guava MapInterfaceTest 来测试你的 class
How to use Guava MapInterfaceTest to test your class
我正在尝试测试我编写的 class,它使用 Guava-testlib MapInterfaceTest
从 Java 实现了地图。当我尝试 运行 我的实现 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);
考虑到您的 MyMap
class 中可见的代码,失败是很正常的:因为您没有重写 Object#equals
方法,您使用默认实现,它依赖于基于内存中引用的相等性(Object#equals
使用 ==
实现)。
因此,JVM 会尝试检查这两个对象在内存中是否是同一实例,但事实并非如此。你的测试失败了。
更笼统地说,您必须有时使用非常重要的代码来实现 Map
的完整接口。因此,除非您确切地知道自己在做什么以及为什么这样做,否则更喜欢重用现有的 Map 实现。
我正在尝试测试我编写的 class,它使用 Guava-testlib MapInterfaceTest
从 Java 实现了地图。当我尝试 运行 我的实现 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);
考虑到您的 MyMap
class 中可见的代码,失败是很正常的:因为您没有重写 Object#equals
方法,您使用默认实现,它依赖于基于内存中引用的相等性(Object#equals
使用 ==
实现)。
因此,JVM 会尝试检查这两个对象在内存中是否是同一实例,但事实并非如此。你的测试失败了。
更笼统地说,您必须有时使用非常重要的代码来实现 Map
的完整接口。因此,除非您确切地知道自己在做什么以及为什么这样做,否则更喜欢重用现有的 Map 实现。