Mockito:嘲笑一个将在for循环中循环的arraylist [英] Mockito: mocking an arraylist that will be looped in a for loop
问题描述
我有一个测试方法,其中包含以下代码段:
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循环中循环的arraylist的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!