Mockito: mocking an arraylist that will be looped in a for loop

后端 未结 2 1586
眼角桃花
眼角桃花 2021-01-31 10:07

I have a method under test that contains the following snippet:

private void buildChainCode(List lines){
    for(TracedPath path : lines){
             


        
相关标签:
2条回答
  • 2021-01-31 10:36

    The Java For-Each loop used inside your buildChainCode method isn't calling get(), as you already figured out - it's using the iterator() method defined in Collection<E>, which List<E> extends.

    I really wouldn't recommend mocking the list. There's no advantage to it, unless you absolutely must check that the list was iterated through, and even then, it's better to assert on or verify the results of your class's behaviour given certain inputs.

    Pass some implementation of List<E> like LinkedList<E> with tracedPath in it.

    0 讨论(0)
  • 2021-01-31 10:37

    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.

    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);
    
    0 讨论(0)
提交回复
热议问题