I test di contesto di primavera non riescono a trovare le posizioni di configurazione

StackOverflow https://stackoverflow.com/questions/1009357

  •  06-07-2019
  •  | 
  •  

Domanda

Ho un'ampia applicazione distribuita su più file XML di definizione bean Spring. Nella mia suite di test carico manualmente i file XML di cui ho bisogno usando un FileSystemXmlApplicationContext per eseguire i test che voglio eseguire. Ciò riduce i tempi di configurazione del test e mi consente di utilizzare gli stessi file di configurazione esatti utilizzati nella produzione.

Ora sto cercando di utilizzare le classi di test transazionali di Spring che prendono le posizioni di configurazione e caricano il contesto per me. Per qualche motivo quando viene creato il contesto dell'applicazione, Spring non riesce a trovare nessuno dei file di configurazione. Questo è confuso perché eseguo il test dalla stessa directory di lavoro di quando carico la configurazione da solo usando FileSystemXmlApplicationContext. Se antepongo tutte le mie posizioni di configurazione con " file: " vengono trovati i percorsi specificati nel mio test, ma non è possibile trovare tutti i file importati o referenziati dai bean definiti nella configurazione (ad es. file delle proprietà). Qual è l'accordo? Posso ottenere test che estendono le classi di test del contesto primaverile per funzionare allo stesso modo di quelle in cui creo io stesso il contesto?

Ad esempio, la creazione del contesto in questo modo funziona bene:

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

Se estendo AbstractTransactionalDataSourceSpringContextTests ciò che segue non trova services-context.xml:

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

Questo trova il contesto dei servizi, ma il PropertyPlaceholderConfigurer definito lì dentro non riesce a trovare i suoi file delle proprietà.

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
È stato utile?

Soluzione 2

Oltre a sovrascrivere getConfigLocations ho anche scavalcato loadContext e ho usato un fileSystemXmlApplicationContext attendibile lì dentro

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

Altri suggerimenti

Mettiamo tutti i nostri file di configurazione e proprietà Spring nel percorso di classe, il che semplifica le cose - possiamo semplicemente estendere le nostre classi di test da una classe di base come:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

Qui, i percorsi sono tutti percorsi in classpath.

Se non vuoi farlo, hai verificato come stai facendo riferimento ai file delle proprietà nel tuo services-context.xml? Sospetto che se aggiungi il file: alla tua configurazione di contesto, dovrai anche aggiungere questo al riferimento al tuo file di proprietà. Forse potresti semplicemente utilizzare un file di configurazione Spring di prova separato per modificare la definizione del segnaposto della proprietà e posizionarlo alla fine dell'elenco dei file di contesto: le sue definizioni sostituiranno quelle definite nei file precedenti.

Le posizioni di configurazione sono URI relativi e verranno interpretate come tali dalla classe di test di base, con l'URI che verrà risolto in relazione alla posizione della classe di test stessa. Prova a utilizzare URI completamente qualificati o usa l'URI relativo tenendo conto della classe di test.

Non puoi usare fabbriche XML classpath come ClassPathXmlApplicationContext ?

Un'altra possibile soluzione è duplicare il services-config.xml e rinominarlo come services-config-test.xml e quindi inserirlo in classpath. La stessa cosa vale per il file delle proprietà.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top