2013-08-29 7 views
17

Chcę stworzyć szydzili listy przetestować poniżej kodu:Tworzenie szydzili listy przez Mockito

for (String history : list) { 
     //code here 
    } 

Oto moja realizacja:

public static List<String> createList(List<String> mockedList) { 

    List<String> list = mock(List.class); 
    Iterator<String> iterHistory = mock(Iterator.class); 

    OngoingStubbing<Boolean> osBoolean = when(iterHistory.hasNext()); 
    OngoingStubbing<String> osHistory = when(iterHistory.next()); 

    for (String history : mockedList) { 

     osBoolean = osBoolean.thenReturn(true); 
     osHistory = osHistory.thenReturn(history); 
    } 
    osBoolean = osBoolean.thenReturn(false); 

    when(list.iterator()).thenReturn(iterHistory); 

    return list; 
} 

Ale kiedy uruchomić test to rzucać wyjątek w wierszu :

OngoingStubbing<DyActionHistory> osHistory = when(iterHistory.next()); 

do szczegółów:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 

Jak mogę to naprawić? Dzięki

+1

możliwym duplikatu [Mockito: szyderczy ArrayList, które zostaną zapętlone w pętli] (http: // stackoverflow. com/questions/18483176/mock-kpiarka-tablica-ta-będzie-zapętlona-w-pętli) –

Odpowiedz

19

OK, to jest złe. Nie kpij z listy; zamiast tego drwi z poszczególnych obiektów na liście. Zobacz, jak to zrobić: Mockito: mocking an arraylist that will be looped in a for loop.

Ponadto, dlaczego używasz PowerMock? Wydaje się, że nie robisz niczego, co wymaga PowerMocka.

Ale prawdziwą przyczyną problemu jest to, że używasz when na dwóch różnych obiektach, zanim zakończysz stubbing. Kiedy zadzwonisz pod numer when i podasz wywołanie metody, które próbujesz podłączyć, następną rzeczą, którą zrobisz w Mockito OR PowerMock, jest określenie, co się stanie, gdy ta metoda zostanie wywołana - czyli wykonanie części thenReturn. Każdemu wywołaniu numeru when musi towarzyszyć jedno i tylko jedno połączenie z thenReturn, zanim wykonasz więcej połączeń z numerem when. Wykonałeś dwa połączenia do when bez wywoływania thenReturn - to jest twój błąd.

+1

ale jeśli NAPRAWDĘ musiałaś, jak byś kpiła z listy? – BlueShark

+2

Dlaczego NAPRAWDĘ musiałbyś? To nieodmienna rzecz do zrobienia. To jest jak pytanie "co by było, gdybyś NAPRAWDĘ musiał użyć młotka do napędu śruby". To niewłaściwe podejście - niewłaściwe narzędzie do pracy. –

+0

jak powrócić do normalnej listy, a następnie z wyszydzanymi przedmiotami? – BlueShark

2

Możemy poprawiać listę poprawnie dla pętli foreach. Poniżej znajdziesz fragment kodu i objaśnienia.

To jest moja aktualna metoda klasy, w której chcę utworzyć przypadek testowy przez kpiącą listę. this.nameList to obiekt listy.

public void setOptions(){ 
    // .... 
    for (String str : this.nameList) { 
     str = "-"+str; 
    } 
    // .... 
} 

Pętla foreach działa wewnętrznie na iteratorze, więc tutaj stworzyliśmy makietę iteratora. Platforma Mockito ma możliwość zwracania pary wartości na konkretnym wywołaniu metody za pomocą Mockito.when().thenReturn(), tj. Na hasNext() mijamy pierwszą prawdziwą, a drugą fałszywą, tak że nasza pętla będzie kontynuowana tylko dwa razy. Na next() po prostu zwracamy rzeczywistą wartość zwracaną.

W ten sposób możemy uniknąć wysyłania rzeczywistej listy do testowania za pomocą makiety listy.

4

Gdy mamy do czynienia z szyderczy list i ich iteracji, zawsze używać coś takiego:

@Spy 
private List<Object> parts = new ArrayList<>();