这是一个简单的例子:
//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)
表示:在第一次调用和第二次返回false
true
。InOrder
对象用于验证调用顺序。更改顺序或删除nextItem()
呼叫,测试将失败。
或者,您可以使用以下语法:
given(mock.isEmpty()).
willReturn(false).
willReturn(true).
willThrow(SpecialException.class);
如果需要更强大的 mocking 语义,可以引入重炮——自定义应答回调:
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();
}
}
});
但这很容易导致无法维护的测试代码,谨慎使用。
最后,您可以通过仅模拟选定的方法来窥探您的真实对象。