2017-04-04 52 views
1
public List<Object> getDummyData(String testString) {  
    final List<String> result1 = utility.getData(testString); 
    final List<String> result2 = utility.getData(result1.get(0).split(~)[0]);  
    // Processing of result2 and few more method calls  
    return someListOfObject; 
} 

我需要模擬上述方法調用的方法。當我用下面的代碼去:如何嘲笑被調用兩次的方法和第二方法調用的參數是使用Mockito的第一個方法調用的輸出

MainApp mock= Mockito.mock(MainApp.class); 
List<String> mockList = Mockito.mock(ArrayList.class); 
doReturn(mockList).when(mock).getData("str"); 

我在第二次方法調用運行測試用例時得到IndexOutOfBoundsException。

+0

任何進一步的反饋?有什麼我可以添加,讓你考慮upvote /接受? – GhostCat

回答

1

其原因的例外是該行:

utility.getData(result1.get(0).split(~)[0]); 

你想從您的第一個電話,結果分裂。 但你沒有指定任何有關該模擬的內容!而當你沒有指定任何東西的時候,那麼當模擬器調用方法時,mockito只會返回dummy/empty/null數據。

而且你不必。您絕對模擬一個列表對象。您只需創建一個適合您測試的列表;像

List<String> dummyList = Arrays.asList("whatever", "strings", "you need"); 

只是爲了說的很清楚:嘲諷是你最後勝地。你只需要用它來控制你需要控制的物體;並且不能以任何其他方式進行控制。

列表是非常容易控制的:通過創建一個列表,其中包含您需要在列表中。

你的問題的另一部分:您可以輕鬆地指示到的Mockito返回不同的結果時,同樣的方法重複調用;例如如圖所示here

+0

Thaks重播。我明白了你的觀點,但仍然在這種情況下,即使我創建了一個列表,因爲你已經提出了方法調用的方式,即getData是如何區分的? 'MainApp mock = Mockito.mock(MainApp.class); 列表 dummyList = Arrays.asList(「whatever」,「strings」,「you need」); doReturn(dummyList).when(模擬).getData(「str」)' – Niks

+0

請參閱我的更新。 – GhostCat

1

你得到一個錯誤的原因是Mockito.mock(ArrayList.class)沒有值,所以當get(0)你得到IndexOutOfBoundsException

相反,你應該在真實的列表中把數據。

MainApp mock= Mockito.mock(MainApp.class); 
List<String> resultA = Arrays.asList("some~value", "some~other~value"); 
doReturn(resultA).when(mock).getData("str"); 
List<String> resultB = Arrays.asList("other value", "more other values"); 
doReturn(resultB).when(mock).getData("some"); 

雖然上面的工作,我會建議使用matchers進行嘲笑,然後驗證正確的結果。原因是如果測試失敗,你會得到更好的錯誤信息。

MainApp mock= Mockito.mock(MainApp.class); 

// Mock multiple return values 
Mockito.when(mock.getData(anyString()) 
    .thenReturn(Arrays.asList("some~value", "some~other~value")) 
    .thenReturn(Arrays.asList("other value", "more other values")); 

List<SomeObjects> result = getDummyData("some-arg"); 
Mockito.verify(mock).getData("some-arg"); //Verify correct calls 
Mockito.verify(mock).getData("some"); 

// verify result