2016-04-14 1 views
40

Ich verwende Mockito für den Dienst später Unit-Tests. Ich bin verwirrt, wenn doAnswer vs thenReturn zu verwenden.Mockito: doAnswer Vs thenReturn

Kann mir jemand im Detail helfen? Bisher habe ich es mit thenReturn probiert.

Antwort

62

Sie sollten thenReturn oder doReturn verwenden, wenn Sie den Rückgabewert zu dem Zeitpunkt kennen, zu dem Sie einen Methodenaufruf vortäuschen. Dieser definierte Wert wird zurückgegeben, wenn Sie die Mock-Methode aufrufen.

thenReturn(T value) Legt einen Rückgabewert fest, der beim Aufruf der Methode zurückgegeben wird.

@Test 
public void test_return() throws Exception { 
    Dummy dummy = mock(Dummy.class); 
    int returnValue = 5; 

    // choose your preferred way 
    when(dummy.stringLength("dummy")).thenReturn(returnValue); 
    doReturn(returnValue).when(dummy).stringLength("dummy"); 
} 

Answer wird verwendet, wenn Sie zusätzliche Aktionen tun müssen, wenn eine verspottet Methode aufgerufen wird, z.B. wenn Sie den Rückgabewert basierend auf den Parametern dieses Methodenaufrufs berechnen müssen.

Verwenden doAnswer(), wenn Sie einen void-Methode mit generischen Answer Stub wollen.

Antwort gibt eine Aktion, und einen Rückgabewert ausgeführt wird, der zurückgegeben wird, wenn Sie mit dem Modell interagieren.

@Test 
public void test_answer() throws Exception { 
    Dummy dummy = mock(Dummy.class); 
    Answer<Integer> answer = new Answer<Integer>() { 
     public Integer answer(InvocationOnMock invocation) throws Throwable { 
      String string = invocation.getArgumentAt(0, String.class); 
      return string.length() * 2; 
     } 
    }; 

    // choose your preferred way 
    when(dummy.stringLength("dummy")).thenAnswer(answer); 
    doAnswer(answer).when(dummy).stringLength("dummy"); 
} 
+0

Dank @schlauergerd. Jetzt habe ich verstanden. –

+0

hallo @Roland Weisleder, aber manchmal sollten Sie einen Wert erzeugt inneren Code und nichts zurückgeben mit Argumenten zu tun, zum Beispiel 'Code = UUID.randomUUID()', fand ich unmöglich, dies mit 'mockito' zu implementieren. – zhuguowei

+0

Wenn Ihr Mock für jeden Aufruf eine neue UUID zurückgeben soll, implementieren Sie die 'Answer' nur mit' return UUID.randomUUID(); '. –