2015-11-02 28 views
3

好吧,我有一些測試代碼,我想插入一個短暫的延遲,每當一個特定的方法被調用(模擬網絡干擾等)。我可以使用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秒的延遲,然後調用實際的方法。

+0

http://stackoverflow.com/questions/12813881/can-i-delay-a-stubbed-method-response-with-mockito – Rustam

+0

如果你讀到這個問題,你會意識到他們正在返回一個靜態值,而不是實際的方法調用,這正是我正在嘗試做的。 – Kylar

回答

6

已經有一個CallsRealMethodsAnswer您可以擴展,並與延遲裝飾:

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(); 
+0

完美,謝謝。 – Kylar

相關問題