2016-11-03 89 views
2

與通常的Mockito,如果你是一個磕碰被調用多次的方法,你會做如何使用獲得的Mockito空Stubber爲程序化的磕碰

Mockito 
    .doReturn(0) 
    .doReturn(1) 
    .doReturn(2) 
    .when(mock).getValue(); 

我想programaitcally存根方法被調用多次,像

Stubber stubber; 
for (int i = 0; i < 8; ++i) { 
    stubber.doReturn(i); 
} 
stubber.when(mock).getValue(); 

我的問題是似乎沒有成爲一個公共Stubber工廠方法。有org.mockito.internal.MockitoCore.stubber()new org.mockito.internal.stubbing.StubberImpl(),但都是內部的,並使用它們感覺不對。

是否有像這樣的編程方式存在更好的模式?有沒有更好的方法來獲得空的Stubber

一個解決方案將是when().thenReturn(),但我從the difference between doReturn() and then()閱讀以來一直避免。

回答

2

獲得Stubber的唯一官方方式是致電doReturndoAnswer(etc)。

爲磕碰像的更好的圖案是使用returnsElementsOf

List<Integer> returnValues = new ArrayList<>(); 
for (int i = 0; i < 8; ++i) { 
    returnValues.add(i); 
} 
doAnswer(returnsElementsOf(returnValues)).when(mock).getValue(); 

也可以通過在一個陣列到doReturn,已經採用的陣列兼容的可變參數,而僅作爲其兩參數過載:

int[] returnValues = new int[7]; 
for (int i = 1; i < 8; ++i) { 
    returnValues[i] = i; 
} 
doReturn(0, returnValues).when(mock).getValue(); 
+0

我試過這個間諜對象,它只適用於void方法上的doAnswer,而不適用於非void方法上的doReturn。只是我還是可以證實這一點? – lazlev

+1

@lazlev那麼,我犯了一個愚蠢的錯誤,並且交換了'doReturn'和'doAnswer',所以讓我先解決它。在你提到的錯誤的「doReturn」案例中,你看到了什麼行爲? –

+0

我得到'org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ReturnsElementsOf無法由methodName()'返回。我在發送一個字符串列表,因爲我嘲笑的方法是返回一個字符串。 – lazlev