2013-11-15 98 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"); 
}};