24

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

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

4

2 回答 2

63

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

与其模拟列表,我强烈建议你只传递一个真实的列表,其中的元素只是你的模拟TracedPath,你想要多少次都可以。就像是

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath);
于 2013-08-28T09:19:56.073 回答
7

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

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

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

于 2013-08-28T09:23:08.630 回答