2011-06-09 26 views
22

Así que entiendo que en Mockito @InjectMocks inyectará todo lo que pueda con la anotación de @Mock, pero ¿cómo manejar este escenario?Múltiples niveles de @Mock y @InjectMocks

@Mock 
private MockObject1 mockObject1; 

@Mock 
private MockObject2 mockObject2; 

@InjectMocks 
private SystemUnderTest systemUnderTest = new SystemUnderTest(); 

Imagínese que MockObject2 tiene un atributo que es de tipo MockObject1 y SystemUnderTest tiene un atributo de tipo MockObject2. Me gustaría tener mockObject1 inyectado en mockObject2, y mockObject2 inyectado en systemUnderTest.

¿Esto es posible con las anotaciones?

Respuesta

20

Como no recibí ninguna respuesta aquí, pregunté en los foros de Mockito. Aquí hay un enlace a la discusión: https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

Para resumir las respuestas, técnicamente esto podría derrotar el propósito de la burla. En realidad, solo debería burlarse de los objetos que necesita la clase SystemUnderTest. Burlarse de cosas dentro de objetos que son burlas es algo sin sentido.

Si realmente quería hacerlo, @spy puede ayudar a

+3

Sí, no es apropiado para la unidad * * pruebas en las que se utiliza de burla, pero esta característica (dependencias de inyección hasta el fondo) pueden ser muy útiles para la integración * * pruebas. Actualmente estoy trabajando en ello para mi propio kit de herramientas de burla, JMockit. –

2

Esto funciona para mí:

private MockObject1 mockObject1 = mock(MockObject1.class); 

@Spy 
private RealObject2 realObject = new RealObject2(mockObject1); 

@InjectMocks 
private SystemUnderTest systemUnderTest = new SystemUnderTest(); 
10

Es posible mediante la combinación de @Spy con @InjectMocks. Por su ejemplo, sería:

@Spy 
private MockObject1 mockObject1 = new MockObject1(); 

@Spy @InjectMocks //if MockObject2 has a MockObject1, then it will be injected here. 
private MockObject2 mockObject2 = new MockObject2(); 

@InjectMocks 
private SystemUnderTest systemUnderTest; 
+0

Esto ya no se fomenta con mockito2: http://stackoverflow.com/questions/38567326/is-it-discouraged-to-use-spy-and-injectmocks-on-the-same-field y https://github.com/mockito/mockito/issues/169 –

3

otra solución que he encontrado es el uso de sintaxis de Java en lugar de anotación para que el objeto @Spy inyectado.

@Spy 
private MockObject1 mockObject1 = new MockObject1(); 

@InjectMocks //if MockObject2 has a MockObject1, then it will be injected here. 
private MockObject2 mockObject2 = spy(MockObject2.class); 

@InjectMocks 
private SystemUnderTest systemUnderTest; 
Cuestiones relacionadas