2013-08-29 10 views
17

Ich möchte eine verspottete Liste erstellen unten Code zu testen:erstellen verspottet Liste von Mockito

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

Hier ist meine Implementierung:

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

Aber wenn der Test es Ausnahme in Zeile werfen laufen :

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

für Details:

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! 

Wie kann ich es beheben? Danke

+1

möglich Duplikat [Mockito: eine Arraylist spöttisch, die in einer for-Schleife geschlungen werden] (http: // Stackoverflow. com/questions/18483176/Mockito-Mocking-ein-Arraylist-das-wird-in-einem-Loop-Looping) –

Antwort

19

OK, das ist eine schlechte Sache zu tun. Spotte keine Liste. Spotten Sie stattdessen die einzelnen Objekte in der Liste. Siehe dazu Mockito: mocking an arraylist that will be looped in a for loop.

Warum verwenden Sie auch PowerMock? Du scheinst nichts zu tun, was PowerMock erfordert.

Aber die wahre Ursache für Ihr Problem ist, dass Sie when auf zwei verschiedene Objekte verwenden, bevor Sie das Stubbing abschließen. Wenn Sie when aufrufen und den Methodenaufruf angeben, den Sie versuchen zu stubnen, dann ist die nächste Sache, die Sie in Mockito ODER PowerMock tun, zu spezifizieren, was passiert, wenn diese Methode aufgerufen wird - das heißt, den thenReturn Teil zu tun. Jeder Anruf an when muss von einem einzigen Anruf an thenReturn gefolgt werden, bevor Sie weitere Anrufe zu when tätigen. Sie haben zwei Anrufe an when ohne Anruf thenReturn - das ist Ihr Fehler.

+1

Aber wenn Sie WIRKLICH mussten, wie würden Sie eine Liste spotten? – BlueShark

+2

Warum würden Sie wirklich müssen? Es ist immer falsch, etwas zu tun. Das ist wie die Frage "Was wäre, wenn Sie wirklich einen Hammer benutzen müssten, um eine Schraube zu drehen". Es ist der falsche Ansatz - das falsche Werkzeug für den Job. –

+0

Wie gibst du eine normale Liste zurück, dann mit verspotteten Gegenständen drin? – BlueShark

2

Wir können für foreach loop richtig spotten Liste. Nachfolgend finden Sie einen Codeausschnitt und eine Erläuterung.

Dies ist meine eigentliche Klassenmethode, bei der ich einen Testfall erstellen möchte, indem ich Liste spotte. this.nameList ist ein Listenobjekt.

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

Die foreach-Schleife arbeitet intern auf Iterator, so hier wir mock von Iterator crated. Mockito-Framework verfügt über die Möglichkeit, bei einem bestimmten Methodenaufruf Werte zurückzugeben, indem Mockito.when().thenReturn() verwendet wird, d. H. Unter hasNext() übergeben wir den ersten wahren und den zweiten Aufruf false, sodass unsere Schleife nur zwei Mal fortgesetzt wird. Unter next() geben wir nur den tatsächlichen Rückgabewert zurück.

@Test 
public void testSetOptions(){ 
    // ... 
    Iterator<SampleFilter> itr = Mockito.mock(Iterator.class); 
    Mockito.when(itr.hasNext()).thenReturn(true, false); 
    Mockito.when(itr.next()).thenReturn(Mockito.any(String.class); 

    List mockNameList = Mockito.mock(List.class); 
    Mockito.when(mockNameList.iterator()).thenReturn(itr); 
    // ... 
} 

Auf diese Weise können wir vermeiden, tatsächliche Liste zu senden, um zu testen, indem Sie List der Liste verwenden.

4

Wenn sie mit spöttischen Listen und Iterieren sie zu tun, verwende ich immer so etwas wie:

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