2016-08-02 7 views
0

私は、次のインタフェースがあります。私はそれだけで、例えば、特定のタイプのとStringをリストを受信することをテストで確認したいMockito - リストマッチャーでリストタイプを制限する方法は?

public interface ListHandler { 

    public boolean add(List<?> list, Object element); 

} 

いるが。私は次のテストをコード化しました:

@Test 
public void testAddOnlyString() { 
    boolean actual = false; 

    when(this.listHandlerMock.add(
     Matchers.anyListOf(String.class), 
     Matchers.anyString() 
    )).thenReturn(true); 

    actual = this.listHandlerMock.add(new ArrayList<Integer>(), 1); 
    assertTrue(actual); 

    verify(this.listHandlerMock).add(
     Matchers.anyListOf(String.class), 
     Matchers.anyString() 
    ); 
} 

しかし、テストは正しく行われます。

+0

ジェネリック型消去のため、実行時にジェネリック型を認識できません。 'anyListOf'マッチャーは、リストのすべての要素がこの型であることをチェックしていますが、リストは空であるため、決して失敗しません。とにかく、あなたはあなたが渡しているリストを知っています - なぜあなたはどのリストにもアサートしていますか? 'list = new ArrayList 'と同じオブジェクトを期待する: 'sameInstance(list)' –

+0

ところで、あなたの実際のオブジェクトはどこですか?テストがしていることはすべて、モックとやりとりすることです。ここで何をテストしていますか? –

答えて

2

短い答え:できません。リストのためのタイプの例としては、コンパイル時(型消去) で洗浄され、これはtrueを印刷します:

System.out.println(new ArrayList<Integer>().equals(new ArrayList<String>())); 

またMatchers.anyListOfのドキュメントから:

この方法は、任意の型をしませんチェックすると、あなたのコードをキャストするのを避けるためにそこにしかありません。

リストが空でない場合は、すべてのエントリが予想通りのタイプであることを確認するマッチャを構築できますが、空のリストでは何もできません。

+0

だから、これらのマッチャーの目的は何ですか? – Julen

+0

@Julen Matcher#anyList()への一般的なフレンドリーなエイリアス。 SuppressWarnings( "未チェック")の代わりに、コンパイラの警告をコードから守ることができます。 – user1121883

+0

警告はどのように生成されますか?私はそれを複製して、マッチャーの感覚を理解しようとしています。 – Julen

関連する問題