java - simulacros - simulacro de sismo para niños de primaria
Cómo inyectar un simulacro en un contexto de primavera (2)
De hecho, es un duplicado de
Inyectar Mockito se burla de un frijol de primavera
La anotación de Springockito es exactamente lo que estaba buscando
https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations
Esta pregunta ya tiene una respuesta aquí:
- Inyectar Mockito se burla de un Spring bean 23 respuestas
Tengo una prueba que está usando algunos contextos Spring. En estos contextos, se declaran varios frijoles. Quiero que la prueba use la implementación real de los beans de los contextos, EXCEPTO para uno de ellos, para el cual quiero usar un MOCK.
Traté de hacer que el componente Probar una configuración (con la anotación @Configuration), pero el XML parece tener prioridad sobre la anotación @Bean, por lo que no funciona, de esta manera:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context1.xml", "context2.xml", ...})
@Configuration
public class MyTest{
@Inject
private MyTargetBean target;
private AnotherBean myMock = mock(AnotherBean.class);
@Bean
public AnotherBean myMock() { return myMock; }
.....
Sé que puedo definir los Mocks en XML, pero para eso necesitaría un archivo XML adicional para cada prueba en la que desee hacer esto. Quiero evitar esta complejidad.
¿Hay alguna forma de inyectar un frijol (como un simulacro) en un contexto diferente que a través de XML?
¡Gracias!
Sí, estás en el camino correcto, poner un @Bean
falso en una clase @Configuration
es un enfoque, y voy a describir mi experiencia:
El truco es que necesita utilizar un conjunto diferente de archivos .xml exclusivamente para las pruebas que excluyen las versiones en vivo de esos beans.
@ContextConfiguration(locations = {"context1-test.xml", "context2-test.xml", ...})
Y los archivos "-test-xml" entran en src/test/resources
.
Al menos esa fue mi experiencia al hacer lo mismo. Tal vez haya alguna manera de "anular" los beans con las versiones simuladas, pero hasta ahora no me he dado cuenta.
También elegí poner los simulacros (tenía 5) todos juntos en una configuración propia:
@Configuration
public class MockServicesProvider {
@Bean
public AnotherBean myMock() { return mock(AnotherBean.class); }
}
Otra parte interesante de este problema es el uso común de initMocks(this);
en el método @Before
de tu clase de prueba.
Si los simulacros se usan en otros lugares (y lo son, es por eso que los está initMocks(this)
...) entonces los initMocks(this)
los eliminarán entre pruebas (no literalmente, solo se crearán nuevos simulacros y cualquier otro los simulacros cableados en otros objetos se "perderán").
La solución a esto era llamar al reset(mockObject)
en el método @Before
antes de cada prueba. Se reinician los mismos simulacros (todos los when
e interacciones), sin crear nuevos simulacros.
Tenga en cuenta que los documentos de Mockito para el reset
dicen con mucha severidad que este método no debería usarse comúnmente, excepto en el contexto de los simulacros que se aplican a través de la inyección de dependencia, como de hecho estamos haciendo en este caso :)
¡Que te diviertas!