簡単な例を次に示します。
//given
MyQueue mock = mock(MyQueue.class);
given(mock.isEmpty()).willReturn(false, true);
given(mock.nextItem()).willReturn(someItem);
//when
mock.isEmpty(); //yields false
mock.nextItem(); //yields someItem
mock.isEmpty(); //yields true
//then
InOrder inOrder = inOrder(mock);
inOrder.verify(mock).isEmpty();
inOrder.verify(mock).nextItem();
inOrder.verify(mock).isEmpty();
willReturn(false, true)
意味:最初の呼び出しと2番目の呼び出しで戻りfalse
true
ます。InOrder
オブジェクトは、呼び出し順序を確認するために使用されます。順序を変更するか、呼び出しを削除するnextItem()
と、テストは失敗します。
または、次の構文を使用できます。
given(mock.isEmpty()).
willReturn(false).
willReturn(true).
willThrow(SpecialException.class);
さらに強力なモックセマンティクスが必要な場合は、重砲を導入できます-カスタムアンサーコールバック:
given(mock.isEmpty()).willAnswer(new Answer<Boolean>() {
private int counter = 0;
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
switch(++counter) {
case 1: return false;
case 2: return true;
default: throw new SpecialException();
}
}
});
ただし、これは保守不可能なテストコードにつながる可能性があるため、注意して使用してください。
最後に、選択したメソッドのみをモックすることで、実際のオブジェクトをスパイできます。