我可以使用Mockito插入延迟,然后调用真实方法吗?

时间:2015-11-02 18:22:06

标签: java mockito

好的,我有一些测试代码,我想在调用特定方法时插入一个短延迟(模拟网络干扰等)。

示例代码:

MyObject foobar = Mockito.spy(new MyObject(param1, param2, param3));
Mockito.doAnswer(e -> {
    Thread.sleep(2000);
    foobar.myRealMethodName();
    return null;
}).when(foobar).myRealMethodName();

或类似的东西。基本上,每当myRealMethodName()被调用时,我想要一个2秒的延迟,然后调用实际的方法。

2 个答案:

答案 0 :(得分:7)

已经有一个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();

答案 1 :(得分:1)

您也可以这样:

    Mockito.doAnswer(new AnswersWithDelay(500, new CallsRealMethods()))
            .when(foobar). myRealMethodName();