2010-05-16 8 views
8

Un poco de historia:Cómo reemplazar el comportamiento de la primavera @Autowired

estoy utilizando Spring 2.5, y en concreto la primavera COI y anotaciones.

estoy usando @Autowired en mi código (el Autowiring se realiza por tipo) y utilizar @Component para exponer clases para el cableado automático.

La situación que se describe a continuación surgió mientras traté de probar mi código.

ahora al problema:

Nota: Yo uso un Contexto de primavera diferente para el entorno de prueba.

tengo una clase FOO que es @Autowired pero en el contexto de prueba I desea utilizar una clase diferente del mismo tipo MockFoo (se extiende FOO).

La configuración de la primavera, por supuesto, no de forma automática debido a las múltiples opciones para la inyección de dependencia de la clase FOO (tanto FOO y MockFOO cumplir con la verificación de Tipo).

Estoy buscando una forma de inyectar el frijol de prueba en lugar del frijol original.

Esperaba que Spring permitiera usar el archivo de configuración Context para anular una inyección de bean o pedir a Spring que no se autoenlace un bean específico.

PERO

Todas estas opciones parece que existe sólo para los granos que se definieron originalmente en el archivo de configuración Contexto primavera.

Respuesta

6

Uso ReflectionTestUtils para establecer manualmente el Mock en lugar de la dependencia autowired (a tal efecto su maqueta no debe ser primavera logrado, por lo que no existe ambigüedad)

+0

esta es una buena solución cuando no se tiene la misma instancia inyectada a múltiples clases - pero en un gran proyecto en el que actúa una clase como proveedor de servicios (es un singleton) y se inyecta a muchas clases, espero que haya alguna solución más fácil/mejor para evitar inyectar a cada clase que use la respuesta original – Mark

2

Sé que esta pregunta es bastante viejo, pero un pienso una respuesta puede ser útil para otros.

Dado que probablemente no desee mezclar Foo y MockFoo dentro de su contexto, le sugiero que elimine Foo del escaneo de componentes. Esto podría hacerse, por ejemplo, especificando include/exclude filters en el <context:component-scan>.

Sin embargo, si está implementando pruebas unitarias, preferiría sugerir no utilizar un contexto Spring y simplemente implementar pruebas de unidades "puras" inyectando maquetas de las dependencias manualmente, para que solo esté probando una sola clase. Esto se puede lograr más fácilmente mediante el uso de un marco de burla como Mockito.

2

Estoy de acuerdo con Didier. Aquí hay un ejemplo de cómo puede excluir las implementaciones que desea simular en el contexto de su aplicación de prueba.

<context:component-scan base-package="com.company" > 
    <context:exclude-filter type="regex" expression="com\.abc\.service\.XDaoImpl"/>  
</context:component-scan> 

Incluir este contexto de aplicación de la prueba de la siguiente manera:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:/applicationContext-test.xml"}) 
public class MyTest {....} 
+0

. Realmente, me iría con esta. No olvide que siempre puede usar @Qualifier (name = "someBean") en su bean inyectado y @Resource (name = "someBean") en el campo donde desea inyectar esa instancia específica de bean. –

Cuestiones relacionadas