问题描述
我有一个正在测试的方法,其中包含以下代码段:
I have a method under test that contains the following snippet:
private void buildChainCode(List<TracedPath> lines){
for(TracedPath path : lines){
/.../
}
}
我的单元测试代码如下所示:
My unit test code looks like this:
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)
,但我猜它从未使用过.
The problem is, that while running the test, the test code never enters the for loop. What when conditions should I specify, so that the for loop would be entered? Currently I have specified when(listOfPaths.get(anyInt())).thenReturn(tracedPath)
, but I guess it is never used.
推荐答案
你的问题是当你在for-each循环中使用一个集合时,它的iterator()
方法被调用了;而且您还没有使用该特定方法.
Your problem is that when you use a collection in a for-each loop, its iterator()
method gets called; and you haven't stubbed that particular method.
我强烈建议您不要模拟列表,而是传递一个真实的列表,其中的元素只是您模拟的 TracedPath
,任意多次.像
Instead of mocking the list, I strongly recommend you just pass a real list, where the elements are just your mocked TracedPath
, as many times as you want it. Something like
listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath);
这篇关于Mockito:模拟将在 for 循环中循环的数组列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!