2012-10-09 39 views
10

Estoy escribiendo una prueba de integración donde se inicializa un xml de contexto de aplicación durante el inicio. Hay varios métodos de prueba en la clase de prueba que hacen uso de un bean específico 'X' (ya definido en el xml). Mi requisito real es simular bean X solo para uno de los métodos de prueba.Reemplace el bean de primavera en un contexto con la versión simulada de otro contexto

Dentro de un método de prueba: Intenté crear un contexto de aplicación separado utilizando ClassPathXMLApplicationContext con solo el bean falso 'M'.

Ahora tengo dos contextos de aplicación (AC): 1. Una creado durante caso de prueba de arranque (que contiene el grano X real) y 2. Una creado usando ClassPathXmlApplicationContext dentro del método de ensayo (que tiene el grano simulado M)

Quiero reemplazar la definición de grano real 'X' dentro de AC: 1, usando la definición de bean simulada 'M' de AC: 2.

¿Alguien puede arrojar algo de luz sobre esto por favor?

Respuesta

16

No hay una manera clara de reemplazar un frijol en un refrescado ApplicationContext a menos que lo cierre y lo actualice de nuevo.

Para emularlo, el enfoque común es usar un Proxy del bean que desea reemplazar y cambiar el objetivo en el tiempo de ejecución.

Puede hacerlo fácilmente utilizando las clases de apoyo marco AOP:

<bean id="realBean" class="RealClass" /> 
<bean id="mockBean" class="MockClass" /> 
<bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource"> 
    <constructor-arg ref="realBean>" /> 
</bean> 

<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean> 
    <property name="targetSource" ref="targetSource" /> 
</bean> 

 

@Test 
public void testWithMockBean() { 
Object real = targetSource.swap(mock); 
.... 
// do your test work 
... 
targetSource.swap(real); 

} 
23

puede:

  • utilizar la anotación Profile si tiene la primavera 3,1.
  • utilizan la anotación Primary
  • uso qualifiers
  • alambre del grano a sí mismo en el contexto de primavera

y estoy seguro de que hay más opciones.

+0

primaria era exactamente lo que estaba buscando. ¡Gracias por eso! – daniel

+2

** @ Primary ** es la mejor respuesta: "Indica que se debe dar preferencia a un bean cuando hay varios candidatos calificados para el autoenlace (...)" – jsosnowski

+0

Para mí \ @Primary también es la mejor respuesta, pero ¿qué sucede cuando cuando se usa \ @Qualifier? – deFreitas

3

Crear una testApplicationContext con

<beans> 
    <import resource="classpath*:appContext.xml" /> 
    <bean id="mockbeanOfX" class=....../> 
</beans> 

y luego cargar este contexto de aplicación de prueba en su caso de prueba. Ahora puede obtener el bean falso del contexto de la aplicación y pasarlo donde sea necesario.

Cuestiones relacionadas