2016-04-14 6 views
40

Sto utilizzando Mockito per il servizio successivo di test delle unità. Sono confuso quando utilizzare doAnswer rispetto a thenReturn.Mockito: doAnswer Vs thenReturn

Qualcuno può aiutarmi nei dettagli? Finora, l'ho provato con thenReturn.

risposta

62

È necessario utilizzare thenReturn o doReturn quando si conosce il valore di ritorno nel momento in cui si prende in giro una chiamata di metodo. Questo valore definito viene restituito quando si richiama il metodo mocked.

thenReturn(T value) Imposta un valore di ritorno da restituire quando viene chiamato il metodo.

@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 viene usato quando si ha bisogno di fare azioni aggiuntive quando un metodo deriso viene richiamato, per esempio quando è necessario calcolare il valore di ritorno in base ai parametri di questa chiamata di metodo.

Usa doAnswer() quando si desidera un metodo stub vuoto con generici Answer.

La risposta specifica un'azione che viene eseguita e un valore di ritorno che viene restituito quando si interagisce con la simulazione.

@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

Grazie @schlauergerd. Ora ho capito. –

+0

hi @Roland Weisleder, ma a volte è necessario restituire un codice interno generato da un valore e nulla a che fare con gli argomenti, ad es. 'code = UUID.randomUUID()', ho trovato impossibile implementarlo con 'mockito'. – zhuguowei

+0

Quando il tuo mock dovrebbe restituire un nuovo UUID per ogni chiamata, implementeresti 'Answer' solo con' return UUID.randomUUID(); '. –