Estoy usando Mockito @Mock
y @InjectMocks
anotaciones 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 @Autowired
campos privados (sin setters). ¿Es esto posible o el mecanismo se limita a inyectar simulacros solamente?
MockitoAnnotations.initMocks(this);
el@Before
mé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
@Spy
anotacionesMockito considerará todos los campos que tengan
@Mock
o@Spy
anotación como candidatos potenciales para ser inyectados en la instancia anotada con@InjectMocks
anotació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 types
new 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
Autowired
campos 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
spy
para 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?@InjectMocks
y@Spy
tambié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
ReflectionTestUtils
para 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