使用Mockito,有没有办法对对象进行spy()并验证对象是否在指定的间隔内被调用了给定的次数,并且返回了这些调用的期望值?
我想做以下事情:
class HatesTwos {
boolean hates(int val) {
return val == 2;
}
}
HatesTwos hater = spy(new HatesTwos());
hater.hates(1);
assertFalse(verify(hater, times(1)).hates(1));
reset(hater);
hater.hates(2);
assertTrue(verify(hater, times(1)).hates(2));
最佳答案
您可以使用Answer
接口(interface)捕获真实的响应。
public class ResultCaptor<T> implements Answer {
private T result = null;
public T getResult() {
return result;
}
@Override
public T answer(InvocationOnMock invocationOnMock) throws Throwable {
result = (T) invocationOnMock.callRealMethod();
return result;
}
}
预期用途:
class HatesTwos {
boolean hates(int val) {
return val == 2;
}
}
HatesTwos hater = spy(new HatesTwos());
// let's capture the return values from hater.hates(int)
ResultCaptor<Boolean> hateResultCaptor = new ResultCaptor<>();
doAnswer(hateResultCaptor).when(hater).hates(anyInt());
hater.hates(1);
verify(hater, times(1)).hates(1);
assertFalse(hateResultCaptor.getResult());
reset(hater);
hater.hates(2);
verify(hater, times(1)).hates(2);
assertTrue(hateResultCaptor.getResult());