2011-11-22 21 views
19

ho questo in Mockito:Mockito thenReturn restituisce stessa istanza

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(new ServiceMock()); 

Il metodo createNewEntityOfType deve sempre restituire una nuova istanza ServiceMock ma restituisce due volte lo stesso riferimento.

Perché il metodo thenReturn non restituisce nuovo ServiceMock?

+1

Prova spegnendo con un [callback] (http: //docs.mockito.googlecode .com/hg/latest/org/mockito/Mockito.html # 11) – McDowell

+0

Grazie! Funziona – myborobudur

risposta

35

Il metodo thenReturn restituirà sempre ciò che gli viene passato. Il codice new Servicemock() è in esecuzione prima della chiamata a thenReturn. Il ServiceMock creato viene quindi passato a thenReturn. Pertanto, thenReturn ha un'istanza assoluta di ServiceMock non un meccanismo di creazione.

Se è necessario fornire una nuova istanza, utilizzare thenAnswer

when(mockedMergeContext.createNewEntityOfType(IService.class)) 
    .thenAnswer(new Answer<IService>() { 
    public IService answer(InvocationOnMock invocation) { 
     return new ServiceMock(); 
    } 
    }); 
+0

Grazie mille per aver salvato la mia giornata :) –

10

Si potrebbe desiderare di refactoring che in istruzioni diverse per capire perché ciò accade.

Service svc = new ServiceMock(); 
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(svc); 

Vedete ora perché non funziona? :)

Restituisce sempre l'istanza di attesa in svc, non rivaluterà new ServiceMock() ogni volta che viene richiamato il metodo.

+1

Hai ragione! Grazie! – myborobudur

3

In Java 8 con lambda si può semplicemente utilizzare

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenAnswer(invocation -> new ServiceMock()); 

Quindi, solo sostituire .thenReturn(new MyMock());

con .thenAnswer(invocation -> new MyMock());

Problemi correlati