Mockito:嘲笑一个将在for循环中循环的数组列表



我有一个正在测试的方法,它包含以下片段:

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),但我想它从未被使用过。

您的问题是,当在for每个循环中使用集合时,会调用其iterator()方法;而且你还没有否决那个特定的方法。

与其嘲笑列表,我强烈建议你只传递一个真实的列表,其中的元素只是你模仿的TracedPath,你可以随心所欲

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath);

buildChainCode方法内部使用的Java For Each循环并没有调用get(),正如您已经发现的那样,它使用的是Collection<E>中定义的iterator()方法,List<E>对此进行了扩展。

我真的不建议嘲笑这个列表。它没有任何好处,除非你绝对必须检查列表是否迭代完成,即使这样,在给定某些输入的情况下,最好断言或验证类行为的结果。

通过一些类似LinkedList<E>List<E>的实现,其中包含tracedPath

相关内容

  • 没有找到相关文章

最新更新