2012-03-01 10 views
6

Ho un'applicazione Web che accede a un servizio Web esterno. Sto scrivendo una suite di test di accettazione automatica per l'applicazione web. Non voglio invocare il servizio web esterno in quanto ha un sovraccarico serio, voglio prendere in giro questo servizio web. Come si può ottenere ciò senza modificare il contesto dell'applicazione dell'applicazione Web? Di recente abbiamo migrato alla Spring 3.1, quindi sono tentato di utilizzare le nuove funzionalità di ambiente. Queste nuove funzionalità potrebbero aiutarmi a ignorare questo singolo servizio Web e lasciare il contesto dell'applicazione così com'è?come eseguire l'override del bean singolo definito nel contesto dell'applicazione

risposta

4

Vorrei utilizzare un BeanFactoryPostProcessor per eseguire questa operazione, che viene registrato solo negli scenari di test che si desidera vengano derisi.

BeanFactoryPostProcessor consente di modificare il contesto dell'applicazione immediatamente dopo la sua creazione e popolamento. Puoi cercare il nome del tuo bean specifico e registrare un bean diverso per esso.

public class SystemTestBeanFactoryPostProcessor implements BeanFactoryPostProcessor 
{ 
    @Override 
    public void postProcessBeanFactory(final ConfigurableListableBeanFactory factory) throws BeansException 
    { 
     final MyInterface myInterface = new MyInterfaceStub(); 
     factory.registerSingleton("myInterfaceBeanName", myInterface); 
    } 
} 

Ciò consentirà di sovrascrivere solo i bean a cui si desidera eseguire lo stub/mock.

Non sono sicuro che questo sia il "nuovo 3.x" modo di fare questo genere di cose. Ma è molto semplice e facile da implementare.

9

Vorrei utilizzare la funzione Spring @Profile, che presumo sia la "funzionalità di ambiente" a cui si stava facendo riferimento.

Ad esempio:

@Service @Profile("dev") 
public class FakeWebService implements WebService { 
} 

@Service @Profile("production") 
public class ExternalWebService implements WebService { 
} 

EDIT

E per specificare il profilo da utilizzare nel test:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/app-config.xml") 
@ActiveProfiles("dev") 
public class MyAcceptanceTest { 
} 

Vedi this section dei documenti di primavera per maggiori dettagli.

Ci sono diversi modi per impostare il profilo attivo nella produzione, ma il metodo che ho usato prima è nel web.xml:

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>spring.profiles.active</param-name> 
     <param-value>production</param-value> 
    </init-param> 
</servlet> 
+0

Dove si specifica che 'Profile' si sta utilizzando nella vostra configurazione di test (o configurazione di produzione)? –

+0

Ho aggiornato la mia risposta con alcuni esempi, è anche possibile utilizzare l'impostazione del profilo in bean.xml se necessario. – seanhodges

+0

+1 Grazie! Un bell'esempio –

Problemi correlati