2010-04-23 7 views
11

Sto provando a testare un'unità webapp che sto sviluppando in Maven/Eclipse. È un'applicazione web MVC di Spring e ho bisogno di alcuni test unitari per testare il controller del mio modello.Unit Test in Maven richiede l'accesso alla directory src/main/webapp

Per fare questo, ho bisogno di usare i miei file config .xml webapp per iniettare il controller, tuttavia, tutta la mia configurazione (e altri file associati che i riferimenti di configs) sono nella directory src/main/webapp (come Convenzione di Maven) - ci sono molti file qui che ho bisogno di fare riferimento nei miei test, ma non sono disponibili quando si esegue il test in quanto non sono sul classpath (Maven sembra solo aggiungere src/main/java, src/test/java, src/main/resources, src/test/resources al classpath ma non src/main/webapps)

Non voglio dover copiare la mia intera webapp nel mio src/test/cartella delle risorse solo a scopo di test: esiste un altro modo per essere in grado di accedervi?

Posso aggirare questo modificando Eclipse "Esegui configurazioni" per includere questa cartella sul classpath, ma che non funzionerà quando si eseguono i test dalla riga di comando?

Qualcun altro ha riscontrato questo? c'è una soluzione conosciuta?

Grazie!

risposta

6

In generale, è consigliabile utilizzare i mock (ad es. EasyMock o jMock) per gestire i test dell'unità per il controller; un test unitario dovrebbe testare un componente in isolamento dal resto del sistema. In Spring 3, puoi definire i tuoi Controller come POJO con annotazioni e quindi semplicemente testare i Controller senza alcuna interazione da Spring.

Se si desidera eseguire più test a livello di integrazione, è possibile posizionare parti comuni dei file di configurazione in src/main/resources in modo che diventino accessibili nel classpath. Quindi utilizzare una configurazione specifica per il test in src/test/risorse per il test. Quel file può importare quei file insieme a qualsiasi cosa di cui hai bisogno, oppure puoi annotare il tuo caso di prova con @ContextConfiguration per specificare i file multipli necessari per assemblare il contesto.

Per un esempio concreto, vedere questo blog post on integration testing Spring MVC. Lo Testing chapter of the Spring manual ha anche una decente panoramica dei test di integrazione in primavera.

0

Per fare questo, ho bisogno di usare i miei file di configurazione XML webapp per iniettare il controller, però, tutta la mia configurazione (e altri file associati che le configurazioni di riferimento) si trovano nella directory src/main/webapp

Quali sono quei file che è necessario anche durante i test unitari esattamente?

Non voglio dover copiare la mia intera webapp nella mia cartella src/test/risorse solo a scopo di test - esiste un altro modo per essere in grado di accedervi?

No. Se si desidera che siano nel classpath, metterli sia in src/main/resources o src/test/resources, file sotto src/main/webapp non sono nel classpath, perché non si suppone che.

+0

Grazie per la risposta rapida, I file di cui ho bisogno sono i file webmvc-config di primavera, in quanto ho bisogno di creare un contesto fittizio per il mio controller web - e sfortunatamente i file di configurazione contengono anche riferimenti ad altri file all'interno della cartella webapps. Fortunatamente ora ho aggirato questo problema creando file di configurazione di "test" primaverili che non si riferiscono a nessuna delle risorse aggiuntive dell'app web che non sono rilevanti (solo i bean controller richiesti per il test dell'unità) e hanno messo solo il mio test personalizzato file di configurazione in src/test/risorse. – rhinds

4

Il primo collegamento di Emil era corretto nel mostrare le posizioni @ContextConfiguration corrette.

Se i file di configurazione di Spring sono in src/main/webapp/**, non saranno sul classpath se creati da Maven. Per ottenere la configurazione per i test di integrazione, è sufficiente specificare il percorso utilizzando il prefisso file:.

@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/app-config.xml") 

Se si utilizza STS di primavera plugin per creare un nuovo progetto Spring MVC, si noterà che i file di configurazione contesto di applicazione sono messi nella posizione del mio esempio. Il modo per utilizzarli nei test di integrazione è quindi specificare il percorso utilizzando il prefisso file: come descritto sopra.

3

È possibile ottenere ciò utilizzando Maven-infallibile-plugin come di seguito:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
      <additionalClasspathElements> 
       <additionalClasspathElement>src\main\webapp\</additionalClasspathElement> 
      </additionalClasspathElements> 
     </configuration> 
    </plugin> 

Ora è possibile accedere al proprio web.xml in questo modo, ad esempio:

getClass().getClassLoader().getResourceAsStream("classpath:webapp/WEB-INF/web.xml") 
+0

Ha funzionato per me utilizzando @ContextConfiguration (posizioni = {"classpath: /WEB-INF/beans.xml"}) – Ena

+0

Mark, Innanzitutto grazie per l'idea. Ma il tuo suggerimento è molto hard-coded. 1. Viene utilizzato il separatore di file basato su Windows. 2. Viene utilizzato il percorso relativo. Se esegui test dal modulo Maven padre, questo aggiungerà il tuo percorso (src \ main \ webapp \) al suo percorso (modulo genitore) e otterrai di conseguenza un percorso illegale alla risorsa. Vorrei cambiarlo in " $ {project.basedir} $ {file.separator} src $ {file.separator} main $ {file.separator} webapp" –

+0

Inoltre c'è un modo più elegante per accedere alla risorsa. Provare quanto segue "getClass(). GetClassLoader(). GetResourceAsStream ("/WEB-INF/web.xml ")". È possibile sostituire la directory principale con quella indipendente dal sistema operativo utilizzando il metodo # Elenco dei file. –