我有一个测试方法,其中包含以下代码段:
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)
,但我想它从未使用过。
答案 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
一起传递给其中。