2012-10-09 12 views
10

Sto scrivendo un test di integrazione in cui un contesto applicativo xml viene inizializzato durante l'avvio. Ci sono diversi metodi di test nella classe di test che fanno uso di un bean specifico 'X' (già definito nell'xml). Il mio attuale requisito è quello di deridere il bean X solo per uno dei metodi di test.Sostituisci bean spring in un contesto con la versione mock da un altro contesto

All'interno di un metodo di prova: ho provato a creare un contesto di applicazione separato utilizzando ClassPathXMLApplicationContext con solo il mock bean "M".

Ora ho due Application Contesti (AC): 1. Un creato durante banco di prova di avvio (che contiene il fagiolo X effettiva) e 2. Un creati utilizzando ClassPathXmlApplicationContext all'interno del metodo di prova (che ha il fagiolo finto M).

Desidero sostituire la definizione di bean effettiva 'X' in CA: 1, utilizzando la definizione di mock bean 'M' da AC: 2.

Qualcuno può far luce su questo per favore?

risposta

16

Non esiste un modo chiaro per sostituire un bean in un ApplicationContext aggiornato a meno che non lo si chiuda e lo si aggiorni di nuovo.

Per simularlo, l'approccio comune è quello di utilizzare uno Proxy del bean che si desidera sostituire e modificare la destinazione in fase di esecuzione.

Si può fare facilmente utilizzando le classi di supporto quadro 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

è possibile:

  • utilizzare il Profile annotazione se si dispone di primavera 3.1.
  • utilizzare il Primary annotazione
  • uso qualifiers
  • filo il fagiolo da soli nel contesto primavera

e io sono sicuro che ci sono ancora più opzioni.

+0

primario era esattamente quello che stavo cercando. Grazie per quello! – daniel

+2

** @ Primaria ** è la migliore risposta: "Indica che un bean deve essere preferito quando più candidati sono qualificati per l'autowire (...)" – jsosnowski

+0

Per me \ @Primary è anche la migliore risposta, ma cosa succede quando quando viene usato \ @Qualifier? – deFreitas

3

Creare un testApplicationContext con

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

e poi caricare questo contesto applicazione di test nel vostro TestCase. Ora è possibile ottenere il bean mock dal contesto dell'applicazione e passarlo dove è necessario.

Problemi correlati