Mockito:嘲笑一个将在for循环中循环的arraylist

时间:2013-08-28 08:41:45

标签: java unit-testing mockito

我有一个测试方法,其中包含以下代码段:

private void buildChainCode(List<TracedPath> lines){
    for(TracedPath path : lines){
        /.../
    }
}

我的单元测试代码如下所示:

public class ChainCodeUnitTest extends TestCase {

    private @Mock List<TracedPath> listOfPaths;
    private @Mock TracedPath tracedPath;

    protected void setUp() throws Exception {
        super.setUp();
        MockitoAnnotations.initMocks(this);
    }

    public void testGetCode() {
        when(listOfPaths.get(anyInt())).thenReturn(tracedPath);

        ChainCode cc = new ChainCode();
        cc.getCode(listOfPaths);

        /.../
    }
}

问题是,在运行测试时,测试代码永远不会进入for循环。什么时候我应该指定条件,以便输入for循环?目前我已指定when(listOfPaths.get(anyInt())).thenReturn(tracedPath),但我想它从未使用过。

2 个答案:

答案 0 :(得分:56)

您的问题是,当您在for-each循环中使用集合时,会调用其iterator()方法;你还没有找到那个特定的方法。

我强烈建议您只是传递一个真实的列表,其中元素只是您的模拟TracedPath,而不是模拟列表。像

这样的东西
listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath);

答案 1 :(得分:5)

buildChainCode方法中使用的Java For-Each循环未调用get(),正如您已经发现的那样 - 它使用iterator()中定义的Collection<E>方法,List<E>延伸。

确实不建议嘲笑列表。它没有任何优势,除非您绝对必须检查列表是否经过迭代,即使这样,最好在给定某些输入的情况下断言或验证类的行为结果。

List<E> LinkedList<E>的一些实施方式与tracedPath一起传递给其中。