Mockito:模拟将在 for 循环中循环的数组列表

2022-09-01 19:50:44

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

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)


答案 1

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

与其嘲笑列表,我强烈建议您只传递一个真正的列表,其中的元素只是您的模拟 ,只要您想要的次数。类似的东西TracedPath

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

答案 2

方法中使用的 Java For-Each 循环不是调用 ,正如您已经弄清楚的那样 - 它使用的是 中定义的方法,该方法扩展了。buildChainCodeget()iterator()Collection<E>List<E>

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

在其中传递一些 like 的实现。List<E>LinkedList<E>tracedPath


推荐