0

マッピングのためにmockitoのジェネリッククラスを区別する方法はありますか?

メソッド呼び出しは次のとおりです (ただし、true を返すロジックとは異なります)。

userWrapper.wrapCall( new Client<Boolean, User>(){
   @override 
   public Boolean run(){
         return true
   }
 }

例えば

    Client<Boolean, User> c1 = Mockito.any();
    Client<Account, User> c2 = Mockito.any();

    when (userWrapper.wrapCall( c1 )).thenReturn( true );
    when (userWrapper.wrapCall( c2 )).thenReturn( new Account() );

ただし、ジェネリックを考慮に入れるのではなく、呼び出し可能なクライアントをマップするだけのように見えるため、これは失敗します。returnAnswer を使用してみましたが、.getArgs はメソッドに渡された c1/c2 ではなく、userwrapper のみを返します。

4

1 に答える 1

0

まず、ジェネリクスは erase を介して機能することを思い出してください。c1これは、Mockito が とここでの方法を区別できるものはほとんどないことを意味しc2ます。

次に、変数のような Mockito マッチャーを抽出しないanyでください。Mockito マッチャーは副作用によって機能するため、上記のような呼び出しは奇妙な方法で壊れる可能性があります。ただし、静的メソッドを抽出して呼び出し順序を正しく保つことは問題なく機能するはずです。

あなたの 2 つの最善の策は、 Hamcrest マップ マッチャーを使用する次のように、コンテンツに基づいてマップを別のマップと区別することです。

// Will likely need casts or explicit method type arguments.
when(userWrapper.wrapCall(argThat(hasKey(isInstanceOf(Boolean.class)))))
    .thenReturn(true);
when(userWrapper.wrapCall(argThat(hasKey(isInstanceOf(Account.class)))))
    .thenReturn(new Account());

...または、脆弱なテストにつながる可能性のある呼び出し順序を調べるには:

// May also need generics specified, subject to your Client class definition.
when(userWrapper.wrapCall(Matchers.any()))
    .thenReturn(true).thenReturn(new Account());

後者のものはdoReturn、戻り値の型をチェックできない構文を使用してより適切に表現できます。

于 2014-10-15T03:28:45.090 に答える