2013-08-28 12 views
17

Mam metodę podstawie testu, który zawiera następujący fragment:Mockito: szyderczy ArrayList, które zostaną zapętlone w pętli for

private void buildChainCode(List<TracedPath> lines){ 
    for(TracedPath path : lines){ 
     /.../ 
    } 
} 

Moja jednostka kod testowy wygląda następująco:

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); 

     /.../ 
    } 
} 

Problem polega na tym, że podczas wykonywania testu kod testowy nigdy nie przechodzi do pętli for. Kiedy należy określić warunki, aby wprowadzić pętlę for? Obecnie mam określony when(listOfPaths.get(anyInt())).thenReturn(tracedPath), ale myślę, że nigdy nie jest używany.

Odpowiedz

47

Twój problem polega na tym, że gdy używasz kolekcji w pętli for-each, wywoływana jest jej metoda iterator(); i nie schrzaniłeś tej konkretnej metody.

Zamiast drwić z listy, zdecydowanie polecam po prostu przekazać prawdziwą listę, gdzie elementy są po prostu wyśmiewane TracedPath, tyle razy, ile chcesz. Coś jak

listOfPaths = Arrays.asList(mockTracedPath, mockTracedPath, mockTracedPath); 
+0

Dzięki, to świetny pomysł. Dobre wyjaśnienie. :) –

+0

co, jeśli nie znasz elementów, które zostaną dodane do listy? – BlueShark

+0

Wybierasz elementy, w zależności od tego, co próbujesz przetestować. –

4

Java for-each pętli użyte wewnątrz metoda buildChainCode nie dzwoni get(), jak już zorientowali się - to stosując metodę iterator() zdefiniowany w Collection<E>, który List<E> rozciąga.

I naprawdę nie polecałabym kpić z listy. Nie ma w tym żadnej korzyści, chyba że koniecznie musisz sprawdzić, czy lista została poddana iteracji, a nawet wtedy lepiej jest potwierdzić lub zweryfikować wyniki zachowania twojej klasy, biorąc pod uwagę określone dane wejściowe.

Przepuścić niektóre implementacji List<E>, takich jak LinkedList<E> z tracedPath w nim.

+0

Dziękuję za dobre wyjaśnienie. Zaznaczę to jako odpowiedź, ale bardzo podobna została przesłana zaledwie 3 minuty przed twoją. –

+0

Dziękuję za komentarz. Zostałem wezwany, aby coś naprawić, zanim mogłem skończyć post - c'est la vie :) David's to dobra odpowiedź. –