2014-10-02 12 views
19

Immaginiamo Ho un seguente metodo in qualche classe di servizio:Mockito - restituendo lo stesso oggetto passato nel metodo

public SomeEntity makeSthWithEntity(someArgs){ 
    SomeEntity entity = new SomeEntity(); 
    /** 
    * here goes some logic concerning the entity 
    */ 
    return repository.merge(entity); 
} 

mi piacerebbe testare il comportamento di questo metodo e, quindi, vogliono prendere in giro il repository.merge in modo seguente:

when(repository.merge(any(SomeEntity.class))).thenReturn(objectPassedAsArgument); 

rendimenti repository Poi deriso che ciò che makesSthWithEntity passato ad esso e posso facilmente testarlo.

Qualche idea, come posso forzare il mockito a restituire objectPassedAsArgument?

+0

Si intende quando (repository.merge (any (SomeEntity.class))). ThenReturn (entity); ? –

risposta

17

È possibile implementare uno Answer e quindi utilizzare thenAnswer().

Qualcosa di simile a:

when(mock.someMethod(anyString())).thenAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     return invocation.getArguments()[0]; 
    } 
}); 

Naturalmente, una volta che hai questo si può refactoring la risposta in una risposta riutilizzabile chiamato ReturnFirstArgument o simili.

+9

Esiste già in mockito: 'AddtionalAnswers.returnsFirstArg()' – Brice

+1

È ancora possibile accorciare il codice con 'thenAnswer (i -> i.getArguments() [0])'. Ottima soluzione, e BTW il 'AddtionalAnswers.returnsFirstArg()' mi sta dando alcuni errori. – EliuX

40

o meglio utilizzando Mockito spediti risposte

when(mock.something()).then(AdditionalAnswers.returnsFirstArg()) 

Dove AdditionalAnswers.returnsFirstArg() potrebbero essere importati in modo statico.

+1

Bello! Non mi aspettavo che questo fosse abbastanza comune da essere integrato, non importava "returnsSecondArg", ecc. Mi piace anche usare l'alias 'then() qui come si legge meglio. –

+0

Sì;) abbiamo introdotto l'alias 'then' per leggere meglio se usato in combinazione con il metodo factory statico per risposte personalizzate. – Brice

+0

@MarkPeters, 'AdditionalAnswers' è per" risposte meno comuni ", si dice nella documentazione – smac89

Problemi correlati