2012-03-28 10 views
3

Ich erstelle eine allgemeine allgemeine Mock-Client zum Testen von HTTP-Interaktionen. Dafür wäre ich gerne in der Lage, eine Reihe von Antworten derselben Methode zu machen. Bei einem normalen Mock, wäre dies kein Problem sein:Mocking generische Anzahl von aufeinanderfolgenden Antworten von partiellen Mock mit Mockito

when(mock.execute(any(), any(), any())).thenReturn(firstResponse, otherResponses) 

Allerdings habe ich eine partielle Mock verwenden, wo ich einfach Methode machte die HTTP-Anforderung verspotten will, da es keinen Zugang zu einem Live sein könnte Endpunkt oder das Internet im Allgemeinen in dem Kontext, in dem die Komponententests ausgeführt werden.

Also werde ich so etwas wie tun:

doReturn(response).when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture()); 

aber ich möchte in der Lage sein, mehr als eine Antwort zu unterstützen (nicht viel von einer „Wechselwirkung“). Aber es gibt keine doReturn-Methode, die mehr als eine Antwort gleichzeitig benötigt.

Mein erster Versuch an einer Lösung war es iterativ zu tun:

Stubber stubber = null; 
for (HttpResponse response : responses) { 
    if (stubber == null) { 
     stubber = doReturn(response); 
    } else { 
     stubber = stubber.doReturn(response); 
    } 
} 
stubber.when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture()); 

Dies ist jedoch zu überprüfen, nicht fehlschlagen („Unfinished Anstoßen erkannt“), wenn der Test ausgeführt wird.

So - gibt es eine Möglichkeit, dies mit Mockito zu erreichen?

Danke fürs Lesen.

Antwort

3

können Sie schreiben

doReturn(1).doReturn(2).doReturn(3).when(myMock).myMethod(any(), any(), any()); 

Edit:

Wenn die Werte Sie myArray sind im Array wollen, dann auch

import static java.util.Arrays.asList; 
import static org.mockito.Mockito.doAnswer; 
import org.mockito.stubbing.answers.ReturnElementsOf 

.... 

doAnswer(new ReturnsElementsOf(asList(myArray))) 
    .when(myMock).myMethod(any(), any(), any()); 
+0

Dank verwenden Sie könnten für Ihre antworte David, aber mein Problem ist, dass ich die Anzahl von r im Allgemeinen nicht kenne Es handelt sich um ein Array (oder Varargs). – tveon

+0

@tveon OK, siehe meine Bearbeitung, um mit dem Fall umzugehen. –

+0

Das scheint genau das zu sein, wonach ich gesucht habe. :) – tveon

1

Die Lösung, die ich fand, war doAnswer, um die nächste Antwort im Array zurückzugeben.

Answer<HttpResponse> answer = new Answer<HttpResponse>() { 

    HttpResponse[] answers = responses; 
    int number = 0; 

    @Override 
    public HttpResponse answer(InvocationOnMock invocation) throws Throwable { 
     HttpResponse result = null; 
     if (number <= answers.length) { 
      result = answers[number]; 
      number++; 
     } else { 
      throw new IllegalStateException("No more answers"); 
     } 
     return result; 
    } 
}; 
doAnswer(answer).when(spy).execute(hostCaptor.capture(), requestCaptor.capture(), contextCaptor.capture());