6

クラスをモックし、モックされたオブジェクトのメソッドが呼び出されたときにオブジェクトのスタブ リストを返そうとしています。次のコードを考えてみましょう:

interface MyRepositry{
       public List<MyClass> getMyClassInstances(String str,Long id,List<Integer> statusList);
}

上記のメソッド呼び出しを次のようにモックしています。

when(myRepository.getMyClassInstances("1234", 200L, stubbedList)).thenReturn(stubbedMyClassInstanceList);

どこ

 stubbedList 

は、2 つの整数 1 と 3 を挿入して作成するリストです。実際の呼び出しでも、整数 1 と 3 を持つ構築したリストを渡します。ここでの注意点は、stubbedList オブジェクトと実際の呼び出しのリスト オブジェクトは異なりますが、常に 2 つを含みます。整数 1 と 3。

stubbedMyClassInstanceList    

MyClass インスタンスのスタブ リストです。

ただし、テストを実行すると、mockito は空のリストを返します。私はいくつかのデバッグを行いましたが、mockito は私が使用しているリスト オブジェクトと一致できないと思います

      when(..).thenReturn(..)

呼び出しと実際の呼び出しで、正しい署名が見つかりません。

使えない

anyList() 

私は常に2つの整数(1と3)のリストを渡すので、マッチャー。

カスタムを使用して問題を解決しました

     ArgumentMatcher 

次のように :

     class StatusMatcher extends ArgumentMatcher<List> {
    public boolean matches(Object list) {
        List statuses = ((List) list);
        return (statuses.size() == 2 && statuses.contains(1) && statuses.contains(3));
    }
}

質問は次のとおりです。

1) スタブ/モッキングが正しく機能しない理由についての私の推測はありますか? 2)私が使用した解決策は正しいですか?

4

2 に答える 2

8

Mockito は当然equals()、引数のマッチングに使用します。のequals()メソッドはList<T>、2 つのリストが同じ要素を同じ順序で含む場合に等しいと定義されることを指定します。

あなたが言うカスタム引数マッチャーは、順序を考慮していません。

では、1 と 3 の順序が間違っている可能性がありList<T>ます。

于 2015-10-28T14:34:44.490 に答える
0

Mockito には eq() メソッドがあります

あなたは試すことができます:

import static org.mockito.Matchers.eq;

.....

when(myRepository.getMyClassInstances(eq("1234"), eq(200L), eq(stubbedList)).thenReturn(stubbedMyClassInstanceList);
于 2015-10-28T14:34:17.363 に答える