如何使用Guava MapInterfaceTest来测试你的类

时间:2016-07-12 08:05:17

标签: java unit-testing guava

我正在尝试测试我编写的类,并使用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);

1 个答案:

答案 0 :(得分:3)

考虑到MyMap类中可见的代码,失败是很正常的:因为您没有覆盖Object#equals方法,所以使用默认实现,它依赖于内存引用相等(Object#equals使用==)实现。

因此,JVM会尝试检查两个对象是否都是内存中的相同实例,而这些实例并非如此。而你的测试失败了。

更一般地说,您必须使用(有时)非平凡代码来实现Map的完整界面。因此,除非您确切知道自己的工作以及执行操作的原因,否则请更好地重用现有的Map实现。