2016-07-12 53 views
2

我想要測試一個我寫過的類,它使用Guava-testlib MapInterfaceTest實現了來自Java的Map。當我嘗試運行實現MapInterfaceTest的MapTest時,即使我所做的只是調用LinkedHashMap中的函數,但所有測試都失敗(幾乎爲52/56)。如何使用番石榴MapInterfaceTest來測試你的班級

這是怎麼發生的?如何真正的番石榴接口測試工作,以及如何修復我的代碼?調試器在這裏並沒有真正的幫助。

例如,我有:

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

您需要顯示代碼和測試代碼,因爲否則它是不夠的,看不到測試失敗。 – pinturic

+0

MapInterfaceTest不是我們真正使用的東西;我們幾乎完全使用MapTestSuiteBuilder。 –

回答

3

Considerin g MyMap類中可見代碼,失敗很正常:因爲您沒有覆蓋Object#equals方法,所以使用默認實現,該實現依賴於內存中參考的相等性(Object#equals使用==實現)。

因此,JVM嘗試檢查兩個對象是否在內存中是同一個實例,而他們不是。你的測試失敗了。

在更一般的說明中,您必須使用有時非平凡的代碼來實現Map的完整界面。所以除非你確切地知道你做了什麼,爲什麼你這樣做,更喜歡重用現有的Map實現。

+0

你說得對。我失去了equals和hashCode。在我生成了這兩種方法之後,我的所有測試都通過了 – Mocktheduck

+1

如果您只想覆蓋某些方法並將所有其他方法委託給現有的Map實現,請考慮使用['ForwardingMap'](https://google.github.io /guava/releases/19.0/api/docs/index.html?com/google/common/collect/ForwardingMap.html)。 –