如何使用Mockito模拟For循环

时间:2013-11-15 17:34:31

标签: java unit-testing for-loop junit mockito

我是mockito的新手。我的问题是如何使用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循环是如何被嘲笑的。

4 个答案:

答案 0 :(得分:8)

由于for循环只是iterator()循环的语法糖,你可以只存根该方法并返回模拟的Iterator实例

答案 1 :(得分:2)

使用真实集合几乎总是更好的主意,例如ArrayList用于List实现,或者HashSet用于Set实现。保留您对与外部服务交互或具有副作用或计算难以预测的值的协作者的使用Mockito,或者在编写测试系统时不存在的情况。特别是集合在所有这三个条件下都失败了。

要测试for循环,请将其解压缩到一个采用Collection或Iterable的方法,然后在测试中创建一个List以传入。由于它,您的代码将变得更可靠,更容易理解。

答案 2 :(得分:2)

此外,您可以使用间谍来处理真实的实现与模拟。特别是对于集合,这可能是一种更好的方法,然后嘲笑它们。

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

答案 3 :(得分:0)

Mockito中有一个功能可以处理迭代块内的方法调用模拟。 http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#stubbing_consecutive_calls

清楚地解释了这一点