2016-11-01 4 views
0

を働いていない私は、私のコードの異なる点での2行があります:私はいくつかのユニットテストをしていますMockitoマッチャーは

Message<T1> reply = (Message<T1>) template.sendAndReceive(channel1, message); 

Message<T2> reply = (Message<T2>) template.sendAndReceive(channel2, message); 

をし、テストは両方のステートメントをカバーしています。私は行動を模擬しようとすると、私はこのようないくつかの動作を定義:

Mockito.when(template.sendAndReceive(Mockito.any(MessageChannel.class), Matchers.<GenericMessage<T1>>any())).thenReturn(instance1); 

Mockito.when(template.sendAndReceive(Mockito.any(MessageChannel.class), Matchers.<GenericMessage<T2>>any() )).thenReturn(null); 

私はユニットテストを実行し、いくつかのデバッグを行う、最初の文が返す

ヌルあなたは何マッチャー任意のアイデアを持っていますかうまくいかないようですね?それは常にモックの最後の定義をとります。私はユニットテストを実行し、いくつかのデバッグを行うとき、私はMockito 1.1.10

+1

あなたはタイプ消去に苦しんでいます。 2つの呼び出しの間で異なるのは、GenericMessageの '<>'のジェネリックです。ランタイムJavaにも同じように見えます。最高のアドバイスは、あなたのタイプではなく、渡すオブジェクトに基づいてモックの動作を変えることです。次に、あなたが望む動作を得るでしょう。 –

答えて

2

を使用しています、最初の 文はnullを返します

あなたは thenReturn(..);で二度同じメソッド呼び出しをスタブなかったので、これが起こった

と最後のものはnullです。


あなたの目標を達成するための適切な方法は、メソッドが呼び出されたときに返される連続した戻り値のリストを提供することである。この場合、

Mockito.when(template.sendAndReceive(Matchers.any(MessageChannel.class), Matchers.any(GenericMessage.class))) 
    .thenReturn(instance1, null); 

、最初の呼び出しのために返された値instance1となり、その後の呼び出しではすべてnullが返されます。例hereを参照してください。

Mockito.when(template.sendAndReceive(Matchers.same(channel1), Matchers.any(GenericMessage.class))) 
    .thenReturn(instance1); 
Mockito.when(template.sendAndReceive(Matchers.same(channel2), Matchers.any(GenericMessage.class))) 
    .thenReturn(null); 

あるいはさらに短い、私たちは二行目を省略することができ、unstubbedモックのためのためにデフォルトの戻り値:引数に基づいてtemplate.sendAndReceiveリターン異なる値を作ることになり


別のオプション、アシュリー・フリーズが示唆したように、メソッド呼び出しnullです:

Mockito.when(template.sendAndReceive(Matchers.same(channel1), Matchers.any(GenericMessage.class))) 
    .thenReturn(instance1); 

ここでは、いくつかのchannel1channel2 Aと仮定されていますテストクラスのスコープ内にあり、テスト中のオブジェクトに注入されます(少なくとも、あなたが質問で提供したコードスニペットからそう思われます)。

+0

私はそれについて考えましたが、この方法で私に最後の試行を与えていました。単体テストがコードと結びついているようです。 – Deibys

+0

@Deibys、私は2番目のオプションを追加しました。 'template.sendAndReceive'の呼び出しが完了する順序です。 –