2015-10-14 15 views
6

Ho una classe A con 2 funzioni: function a() che restituisce un numero casuale. funzione b() che chiama a() e restituisce il valore restituito.Mockito quando(). ThenReturn() non funziona correttamente

In un test ho scritto questo:

A test = Mockito.mock(A.class) 
Mockito.when(test.a()).thenReturn(35) 
assertEquals(35,test.a()) 
assertEquals(35,test.b()) 

Il test fallisce alla seconda asserzione. Qualcuno sa perché?

Per essere chiari - questo non è il mio vero codice, ma un semplice codice per spiegare il mio problema

risposta

16

Dato che la classe A viene derisa, tutte le chiamate di metodo non vanno all'oggetto reale. Ecco perché il secondo asserimento fallisce (credo che potrebbe essere ritornato 0).

Soluzione:

Si potrebbe fare qualcosa di simile

when(test.b()).thenCallRealMethod(); 

altro si potrebbe spy come

A test = spy(new A()); 
Mockito.when(test.a()).thenReturn(35); 
assertEquals(35,test.a()); 
assertEquals(35,test.b()); 
+1

@SajanChandran Grazie !! Entrambe le soluzioni funzionano!2 domande: 1) Per la prima soluzione, dovrò fare thenCallRealMethod() per ogni funzione della classe? per ogni funzione con una chiamata a a()? 2) Per la seconda soluzione, qual è la differenza tra "mock" e "spy"? – tamird14

+1

sì, se si desidera utilizzare qualsiasi metodo vero e proprio si deve chiamare 'thenCallRealMethod' e vedere questo per http://stackoverflow.com/questions/28295625/mockito-spy-vs-mock –

+0

Sta a voi decidere in fondo, deridere o invocare il metodo reale –

3

funzione b(), che chiama un()

Forse lo fa nel vostro attuale calcestruzzo A, ma non viene utilizzato in questo caso. Qui viene usato solo il finto.

Quindi è necessario dire al finto che cosa fare per ogni metodo che si desidera chiamare:

Mockito.when(test.b()).thenReturn(35); 
3

perché hai solo un mock quando si chiama con test.a().

È necessario aggiungere Mockito.when(test.b()).thenReturn(35). allora il tuo codice funziona bene

+0

Quindi, se ho una funzione che chiama un() e fa qualcosa con il ritornato valore, e voglio testarlo? a() restituisce un numero casuale e per il test voglio che restituisca un numero fisso che decido. Come lo faccio? – tamird14

+0

@ tamird14 non riesco a ottenere – Jens

+0

diciamo che ho una funzione b() che chiama a(), prende il numero restituito e restituisce il numero inverso (123 e 321 per esempio). Voglio testare questa funzione. Il problema è che non so cosa restituirà a(), perché è casuale. Quindi voglio fare un() restituire il numero 123 (per esempio) in modo da poter scrivere nel test assertEquals (321, A.b()). Voglio testare la funzione quando so quello che un() restituisce in questo caso specifico – tamird14