如何使用 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 实现。