Estoy usando Mockito @Mocky @InjectMocksanotaciones para inyectar dependencias en campos privados que están anotados con Spring @Autowired:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
y
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
Ahora me gustaría también inyectar objetos reales en @Autowiredcampos privados (sin setters). ¿Es esto posible o el mecanismo se limita a inyectar simulacros solamente?

MockitoAnnotations.initMocks(this);el@Beforemétodo. Sé que no está directamente relacionado con la pregunta original, pero para cualquiera que venga más tarde, sería necesario agregarlo para que esto sea ejecutable.@RunWith(MockitoJUnitRunner.class)), no necesitas la líneaMockitoAnnotations.initMocks(this);Respuestas:
Usa
@SpyanotacionesMockito considerará todos los campos que tengan
@Mocko@Spyanotación como candidatos potenciales para ser inyectados en la instancia anotada con@InjectMocksanotación. En el caso anterior, la'RealServiceImpl'instancia se inyectará en la 'demostración'Para más detalles consulte
Mockito-home
@Espiar
@Burlarse de
fuente
Mockito cannot mock/spy following: - final classes - anonymous classes - primitive typesnew RealServiceImpl(),@Spy private SomeService service;crea un objeto real utilizando el constructor predeterminado antes de espiarlo de todos modos.Además de la respuesta @Dev Blanked, si desea utilizar un bean existente creado por Spring, el código puede modificarse para:
De esta manera, no necesita cambiar su código (agregar otro constructor) solo para que las pruebas funcionen.
fuente
Autowiredcampos de las dependencias se crearon correctamente.Mockito no es un marco DI e incluso los marcos DI alientan las inyecciones de constructor sobre las inyecciones de campo.
Entonces solo declaras un constructor para establecer dependencias de la clase bajo prueba:
Usar Mockito
spypara el caso general es un consejo terrible. Hace que la clase de prueba sea frágil, no recta y propensa a errores: ¿qué se burla realmente? ¿Qué se prueba realmente?@InjectMocksy@Spytambién perjudica el diseño general, ya que fomenta las clases hinchadas y las responsabilidades mixtas en las clases.Por favor leer el
spy()javadoc antes de usar que ciegamente (el subrayado no es mío):fuente
En Spring hay una utilidad dedicada llamada
ReflectionTestUtilspara este propósito. Tome la instancia específica e inyecte en el campo.fuente
Sé que esta es una vieja pregunta, pero nos encontramos con el mismo problema al intentar inyectar cadenas. Entonces inventamos una extensión JUnit5 / Mockito que hace exactamente lo que quieres: https://github.com/exabrial/mockito-object-injection
EDITAR:
fuente