2012-04-20 15 views
11

Tengo una definición de Spring XML bean para la que quiero escribir pruebas de integración. La definición de bean XML es parte de un contexto de aplicación más grande donde se incluyen varios de estos archivos usando <import>. Dentro de la definición, hago referencia a varios beans que provienen de otros archivos.Ejemplificación de simulación automática en una prueba de Spring JUnit

Para mi prueba de integración me gustaría crear una instancia de la definición independiente y usar Mockito mocks para todos los otros beans. Hasta ahora, estoy usando algo como esto:

FooIntegrationTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class FooIntegrationTest { 
    @Autowired private ClassUnderTest underTest; 
    @Autowired private MockedClass mock; 

    @Test 
    public void testFoo() { 
    } 
} 

FooIntegrationTest-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <import resource="part-to-test.xml" /> 

    <bean id="mockedClassReferencedByName" class="org.mockito.Mockito" factory-method="mock" c:classToMock="SomeMockedClass" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="OtherMockedClassReferencedByType" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="MockedClass" /> 
    ... 
</beans> 

me gustaría para automatizar la sección de burla bastante tedioso : Idealmente, quisiera que todos los beans que no se encuentran en el contexto de la aplicación se burlen automáticamente. El part-to-test.xml usa @Autowired, así como los beans que se establecen utilizando referencias de nombre. Solo uso archivos XML de definición de bean, y tampoco uso las clases @Configuration ni las anotaciones @Component.

He examinado cómo usar un cargador de contexto personalizado en @ContextConfiguration(loader=...), pero todavía no he encontrado un punto de extensión adecuado para hacerlo. Sprinockito no parece abordar este problema.

¿Hay algún otro proyecto que solucione este problema? Si no, ¿dónde extendería Spring para crear los simulacros automáticamente?

+0

¿Has probado la anotación Mockito @InjectMocks? ¿De qué manera no cumple con sus requisitos? –

+0

@DavidWallace '@ InjectMocks' funciona muy bien para las pruebas unitarias, es decir, prueba una clase particular donde la prueba utiliza objetos simulados. Sin embargo, me gustaría burlarme de todos los objetos a los que se hace referencia en una definición de Spring Bean. Esto significa que necesito poblar el contexto de la aplicación Spring con simulacros (posiblemente con nombre) - No sé cómo '@ InjectMocks' ayuda a hacer esto. –

+0

Bien, voy a pensar en esto un poco más. –

Respuesta

3

Aquí hay un short article with a code example. Una implementación BeanDefinitionRegistryPostProcessor genera un objeto simulado para cada definición de bean que falta. La parte de generación se hace con un MocksFactory, aquí está an example for such a factory.

+0

Esta respuesta fue el punto de partida correcto para abordar el problema: el uso de un 'BeanDefinitionRegistryPostProcessor' hace posible introspectar las definiciones de beans para beans faltantes. Extendí el ejemplo del código para que también se ocupe de los beans que se inyectan usando setters, pero dicha extensión es bastante trivial. –

+0

El segundo enlace está muerto. Q.E.P.D. artículo viejo –

2

Sólo por si alguien todavía está interesada en esta cuestión, que han extendido el código en el artículo mencionado por Yves Martin con la herencia, apoyo a @Inject, etc ... y creado un proyecto Github aquí: https://github.com/rinoto/spring-auto-mock

Cuestiones relacionadas