2012-03-28 63 views
3

我正在創建一個測試HTTP相互作用的通用模擬客戶端。爲此,我希望能夠用同樣的方法做出許多回應。 與正常的模擬,這將不會是一個問題:嘲笑部分模擬與Mockito連續響應的通用數

when(mock.execute(any(), any(), any())).thenReturn(firstResponse, otherResponses) 

不過,我使用的是部分模擬,在這裏我只是想嘲笑方法使HTTP請求,因爲可能沒有進入到現場在單元測試執行的上下文中,對於這個問題,通常是終點或因特網。

所以我會做這樣的事情:

doReturn(response).when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture()); 

不過,我想能夠支持多個響應(沒有太多的「互動」的)。但是沒有任何一種方法,一次只能得到一個以上的答案。

我一個解決方案的首次嘗試是反覆地做到這一點:

Stubber stubber = null; 
for (HttpResponse response : responses) { 
    if (stubber == null) { 
     stubber = doReturn(response); 
    } else { 
     stubber = stubber.doReturn(response); 
    } 
} 
stubber.when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture()); 

這並不能然而,以驗證運行測試時(「未完成的磕碰檢測」)。

所以 - 有沒有辦法用Mockito實現這一點?

感謝您的閱讀。

回答

3

你可以寫

doReturn(1).doReturn(2).doReturn(3).when(myMock).myMethod(any(), any(), any()); 

編輯:

如果你想要的值是數組myArray中,那麼你也可以使用

import static java.util.Arrays.asList; 
import static org.mockito.Mockito.doAnswer; 
import org.mockito.stubbing.answers.ReturnElementsOf 

.... 

doAnswer(new ReturnsElementsOf(asList(myArray))) 
    .when(myMock).myMethod(any(), any(), any()); 
+0

謝謝您回答大衛,但我的問題是,我通常不知道r的數量響應,因爲它是一個數組(或可變參數)。 – tveon 2012-03-29 07:56:27

+0

@tveon好的,看我的編輯如何處理這種情況。 – 2012-03-29 08:29:37

+0

這看起來正是我在找的東西。 :) – tveon 2012-03-29 13:29:33

1

我發現的解決方案是使用doAnswer來返回數組中的下一個響應。

Answer<HttpResponse> answer = new Answer<HttpResponse>() { 

    HttpResponse[] answers = responses; 
    int number = 0; 

    @Override 
    public HttpResponse answer(InvocationOnMock invocation) throws Throwable { 
     HttpResponse result = null; 
     if (number <= answers.length) { 
      result = answers[number]; 
      number++; 
     } else { 
      throw new IllegalStateException("No more answers"); 
     } 
     return result; 
    } 
}; 
doAnswer(answer).when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture());