我有一个正在测试的方法,它包含以下片段:
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
。