sismo simulacros simulacro realizar primaria plan para niños evacuacion escuelas escolares escolar como java spring dependency-injection mocking mockito

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í:

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!