2013-11-15 96 views
2

我是mockito的新手。我的問題是我怎樣才能使用Mockito來模擬一個for循環?如何使用Mockito模擬For循環

對於EG:這是主要類別:

import java.util.HashSet; 
import java.util.Set; 

    public class stringConcatination { 

     public static void main(String[] args) { 
      Set<String> stringSet = new HashSet(); 
      stringSet.add("Robert"); 
      stringSet.add("Jim"); 
      for (String s:stringSet) { 
       s = "hi " + s; 
      } 
     } 

} 

這是測試類:

import java.util.HashSet; 
import java.util.Set; 

import org.junit.Test; 
import static org.mockito.Mockito.mock; 

public class stringConcatinationTest { 

    @Test 
    public void testMain() { 
     Set mockSet = mock(HashSet.class); 
     // -- How to mock For Loop -- 
    } 

} 

我看到這個related question。但我無法理解,for循環如何被嘲弄。

+3

明確解釋這是否有幫助:http://stackoverflow.com/questions/6379308/testing-java-enhanced-for-behavior-with-mockito –

+0

我想你需要模擬迭代器。這裏是[ref](http://stackoverflow.com/questions/6379308/testing-java-enhanced-for-behavior-with-mockito) – chenrui

+0

@Matthew真棒!謝謝 !! – Vikram

回答

8

由於for循環僅僅是iterator()循環的語法糖,你可以只存根方法,並返回嘲笑Iterator實例

+0

謝謝。得到它了 !! – Vikram

2

幾乎總是一個更好的主意,用真正的集合,例如ArrayList的列出實現或HashSet的Set實現。對於與外部服務交互或具有副作用,或者計算難以預測的值或在編寫被測系統時不存在的合作者,請保留Mockito的使用。特別是集合無法滿足這三個條件。

要測試for循環,請將其提取到一個採用Collection或Iterable的方法,然後在您的測試中創建一個List以通過。您的代碼因爲它而更加可靠並且更容易遵循。

+0

謝謝! – khakiout

2

此外,你可以使用間諜來處理真正的實現與模擬。尤其對於收藏品來說,這可能是一種更好的方法,然後嘲笑它們。

@Spy 
private Set<String> mySet = new HashSet<String>() 
{{ 
    add("john"); 
    add("jane"); 
}};