Java 我可以使用Mockito插入延迟,然后调用real方法吗?
好的,我有一些测试代码,我想在调用特定方法时插入一个短延迟(模拟网络干扰等) 示例代码:Java 我可以使用Mockito插入延迟,然后调用real方法吗?,java,mockito,Java,Mockito,好的,我有一些测试代码,我想在调用特定方法时插入一个短延迟(模拟网络干扰等) 示例代码: MyObject foobar = Mockito.spy(new MyObject(param1, param2, param3)); Mockito.doAnswer(e -> { Thread.sleep(2000); foobar.myRealMethodName(); return null; }).when(foobar).myRealMethodName();
MyObject foobar = Mockito.spy(new MyObject(param1, param2, param3));
Mockito.doAnswer(e -> {
Thread.sleep(2000);
foobar.myRealMethodName();
return null;
}).when(foobar).myRealMethodName();
或者类似的。基本上,每当调用
myRealMethodName()
时,我希望有2秒的延迟,然后调用实际的方法。已经有了CallsRealMethods
Answer
可以通过延迟来扩展和修饰:
public class CallsRealMethodsWithDelay extends CallsRealMethods {
private final long delay;
public CallsRealMethodsWithDelay(long delay) {
this.delay = delay;
}
public Object answer(InvocationOnMock invocation) throws Throwable {
Thread.sleep(delay);
return super.answer(invocation);
}
}
然后像这样使用它:
MyObject foobar = Mockito.spy(new MyObject(param1, param2, param3));
Mockito.doAnswer(new CallsRealMethodsWithDelay(2000))
.when(foobar).myRealMethodName();
当然,您也可以使用静态方法使一切变得更加美丽:
public static Stubber doAnswerWithRealMethodAndDelay(long delay) {
return Mockito.doAnswer(new CallsRealMethodsWithDelay(delay));
}
然后像这样使用它:
doAnswerWithRealMethodAndDelay(2000)
.when(foobar).myRealMethodName();
您也可以这样做:
Mockito.doAnswer(new AnswersWithDelay(500, new CallsRealMethods()))
.when(foobar). myRealMethodName();
如果你读过这个问题,你会意识到它们返回的是一个静态值,而不是实际的方法调用,这正是我要做的。