2016-07-12 5 views
2

私が書いたクラスをテストしようとしていますが、Guava-testlib MapInterfaceTestを使ってJavaからMapを実装しています。 MapInterfaceTestを実装しているMapTestを試してみると、私がしたのはすべてLinkedHashMapから関数を呼び出すことであっても、すべてのテストは失敗します(ほぼ52/56)。Guava 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あなたのMyMapクラスに表示されているコードでは、エラーはまったく正常です。Object#equalsメソッドをオーバーライドしなかったので、メモリ内の参照の等価性に依存するデフォルトの実装を使用します(Object#equals==を使用して実装されます)。

結果として、JVMは、両方のオブジェクトがメモリ内の同じインスタンスであるかどうかをチェックしようとします。そしてあなたのテストは失敗します。

Mapの完全なインターフェイスを実装する必要があります。だから、あなたがしていることを正確に知らなければ、それをなぜ行うのか、既存のMap実装を再利用することを好む。

+0

あなたは正しいです。私はequalsとhashCodeがなくなっていました。これらの2つのメソッドを生成した後、すべてのテストが成功しました – Mocktheduck

+1

一部のメソッドをオーバーライドし、残りのすべてを既存の 'Map'実装に委譲したい場合は、[' ForwardingMap'](https://google.github.io /guava/releases/19.0/api/docs/index.html?com/google/common/collect/ForwardingMap.html)。 –

関連する問題