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
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.
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>
- 1. C'è un modo per verificare se un bean è definito nel contesto di primavera?
- 2. errore go - valore multiplo fn() nel contesto a valore singolo
- 3. Annotazione risorsa: Nessun bean qualificante di tipo [javax.sql.DataSource] è definito: singolo bean di corrispondenza previsto ma trovato 2
- 4. Come eseguire uno script ruby nel contesto di bundler?
- 5. Aggiunta programmatica di bean all'applicazione Spring Contesto
- 6. Come avere un contesto di sicurezza primaverile nel contesto figlio
- 7. Spring Security + MVC: domande relative alla definizione del contesto e all'ambito dei bean
- 8. Come eseguire il debug del percorso/file definito requireJS
- 9. Esiste un modo per abilitare o disabilitare la definizione del bean Spring nel file applicationContext.xml?
- 10. Spring genera un'eccezione per bean non definito
- 11. La presenza di molti bean inutilizzati in un contesto Spring Bean spreca risorse significative?
- 12. Come accedere al bean EJB tramite la ricerca del contesto da ServletContextListener
- 13. Sostituisci bean spring in un contesto con la versione mock da un altro contesto
- 14. Come eseguire un singolo test contesto shoulda in Ruby Test :: quadro Unità
- 15. accesso contesto Spring nel pacchetto OSGi
- 16. Aggiunta di bean dinamici a Spring Web Contesto
- 17. Come eseguire un test singolo da MSTEST
- 18. Come ottenere la vista nel contesto del metodo TextWatcher?
- 19. Spring Batch: acquisizione del contesto del passaggio nel processore per il passo partizionato
- 20. Come arrestare il pool di connessione nel contesto di scaricamento?
- 21. Come eseguire un singolo test in Nightwatch
- 22. Tomcat gestione del contesto
- 23. Come assegnare la proprietà del bean un valore Enum nel file di configurazione di Spring?
- 24. ruby: come caricare file .rb nel contesto locale
- 25. definire due bean della stessa classe nel contesto di singola applicazione
- 26. Contesto nel componente "stateless"?
- 27. hashmap nel contesto dell'applicazione php
- 28. L'array JavaScript definito nel costruttore non è definito nel prototipo
- 29. Cosa significa frame_dummy nel contesto della profilazione?
- 30. Come ottenere il nome del bean gestito dall'interno del bean di supporto?
Dove si specifica che 'Profile' si sta utilizzando nella vostra configurazione di test (o configurazione di produzione)? –
Ho aggiornato la mia risposta con alcuni esempi, è anche possibile utilizzare l'impostazione del profilo in bean.xml se necessario. – seanhodges
+1 Grazie! Un bell'esempio –