2011-11-22 11 views
19

tengo esto en Mockito:Mockito thenReturn devuelve misma instancia

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

El método createNewEntityOfType siempre debe devolver una nueva instancia ServiceMock pero devuelve el doble de la misma referencia.

¿Por qué el método thenReturn no devuelve el nuevo ServiceMock?

+1

Trate stubbing con un [devolución de llamada] (http: //docs.mockito.googlecode .com/hg/latest/org/mockito/Mockito.html # 11) – McDowell

+0

¡Gracias! Eso funciona – myborobudur

Respuesta

35

El método thenReturn siempre devuelve lo que se le pasa. El código new Servicemock() se está ejecutando antes de la llamada al thenReturn. El ServiceMock creado se pasa luego al thenReturn. Por lo tanto, thenReturn tiene una instancia absoluta de ServiceMock, no es un mecanismo de creación.

Si necesita proporcionar una nueva instancia, utilice thenAnswer

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

Muchas gracias por salvar mi día :) –

10

Es posible que desee que refactorizar en diferentes estados de entender por qué sucede esto.

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

¿Ves ahora por qué no funciona? :)

Siempre devuelve la retención de instancia en svc, no volverá a evaluar new ServiceMock() cada vez que se invoca el método.

+1

¡Tienes razón! ¡Gracias! – myborobudur

3

En Java 8 con Lambdas sólo puede utilizar

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

Así que basta con sustituir .thenReturn(new MyMock());

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

Cuestiones relacionadas