2010-04-23 5 views
11

Ich versuche Einheit Web-App testen, die ich in Maven/Eclipse entwickeln. Es ist eine Spring MVC Webapp, und ich benötige einige Komponententests, um meinen Modellcontroller zu testen.Unit-Test in Maven erfordert den Zugriff auf die src/main/webapp-Verzeichnis

Dazu muss ich meine webapp config .xml Dateien verwenden, um den Controller zu injizieren, jedoch sind alle meine Konfiguration (und andere zugehörige Dateien, auf die die configs verweisen) im Verzeichnis src/main/webapp (gem Maven Konvention) - es gibt eine Menge von Dateien hier, die ich in meinen Tests referenzieren muss, aber sie sind nicht verfügbar, wenn sie den Test ausführen, da sie nicht im Klassenpfad sind (Maven scheint nur src/main/java hinzuzufügen, src/test/java, src/main/resources, src/test/Ressourcen auf den classpath aber nicht src/main/webapps)

ich will nicht zu haben, meine ganze Webapp in meinen src/test kopieren/Ressourcen-Ordner nur zum Zweck des Testens - gibt es einen anderen Weg, auf sie zuzugreifen?

Ich kann umgehen, indem Sie die Eclipse "Run-Konfigurationen" ändern, um diesen Ordner in den Klassenpfad aufzunehmen, aber das wird nicht funktionieren, wenn die Tests von der Kommandozeile aus ausgeführt werden?

Hat jemand anderes dies gefunden? Gibt es eine bekannte Lösung?

Danke!

Antwort

6

Im Allgemeinen sollten Sie Mocks (z. B. EasyMock oder jMock) verwenden, um Komponententests für Ihren Controller zu verarbeiten. Ein Komponententest sollte eine Komponente isoliert vom Rest des Systems testen. Im Frühling 3 können Sie Ihre Controller als POJO mit Annotationen definieren und die Controller dann einfach testen, ohne dass Interaktionen von Spring überhaupt stattfinden.

Wenn Sie mehr Tests auf Integrationsebene durchführen möchten, können Sie gemeinsame Teile von Konfigurationsdateien in src/main/resources platzieren, damit sie im Klassenpfad zugänglich sind. Verwenden Sie dann eine testspezifische Konfiguration in src/test/resources für Ihren Test. Diese Datei kann diese Dateien zusammen mit allem, was Sie benötigen, importieren, oder Sie können Ihren Testfall mit @ContextConfiguration annotieren, um die mehreren Dateien anzugeben, die zum Zusammensetzen des Kontexts benötigt werden. Für ein konkretes Beispiel siehe blog post on integration testing Spring MVC. Die hat auch einen guten Überblick über Integrationstests im Frühjahr.

0

Um dies zu tun, ich brauche meine Webapp Config XML-Dateien verwenden, um die Steuerung zu injizieren, aber alles meine Konfiguration (und andere zugehörige Dateien, die die configs Referenz) sind im src/main/webapp Verzeichnis

Was sind diese Dateien, die Sie auch genau bei Komponententests benötigen?

Ich möchte nicht meine gesamte webapp in meinen src/test/resources-Ordner kopieren, nur um sie zu testen - gibt es andere Möglichkeiten, auf sie zuzugreifen?

Nein, wenn Sie wollen, dass sie auf dem Classpath sein, setzen Sie sie entweder in src/main/resources oder src/test/resources, Dateien unter src/main/webapp sind nicht auf dem Classpath, weil sie nicht zugelassen sind.

+0

Dank für die schnelle Antwort, Die Dateien, die ich brauche, sind spring webmvc-config-Dateien, wie ich einen Mock-Kontext für meine Web-Controller erstellen muss - und leider enthalten die Konfigurationsdateien auch einen Verweis auf andere Dateien im Webapps-Ordner. Glücklicherweise habe ich dies jetzt durch Erstellen von "Test" -Frühlingskonfigurationsdateien, die sich nicht auf die zusätzlichen Webapp-Ressourcen beziehen, die nicht relevant sind (nur die für den Komponententest erforderlichen Controller-Beans), und habe nur meinen benutzerdefinierten Test eingegeben Konfigurationsdateien in src/test/resources. – rhinds

4

Emils erster Link war korrekt und zeigte die richtigen @ContextConfiguration-Standorte an.

Wenn sich Ihre Spring-Konfigurationsdateien in src/main/webapp/** befinden, befinden sie sich nicht im Klassenpfad, wenn sie von Maven erstellt werden. Um die Konfiguration für Integrationstests zu erhalten, geben Sie einfach den Pfad mit dem Präfix file: an.

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

STS Spring Plugin erstellen Sie ein neues Spring MVC-Projekt Wenn verwenden, werden Sie feststellen, dass die Anwendungskontext Konfigurationsdateien in der Position meines Beispiel gesetzt werden. Die Art, sie im Integrationstest zu verwenden, besteht darin, den Pfad mit dem Präfix file: wie oben beschrieben anzugeben.

3

Sie können diese mit Maven-todsichere-Plugin erreichen, wie unten:

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

Jetzt können Sie Ihre web.xml auf diese Weise zum Beispiel Zugang:

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

Es funktionierte für mich mit @ContextConfiguration (locations = {"classpath: /WEB-INF/beans.xml"}) – Ena

+0

Mark, Erstens danke für die Idee. Aber Ihr Vorschlag ist sehr hart codiert. 1. Windows-basierte Dateitrennzeichen wird verwendet. 2. Der relative Pfad wird verwendet. Wenn Sie Tests vom übergeordneten Maven-Modul ausführen, fügt es Ihren Pfad (src \ main \ webapp \) zu seinem (übergeordneten Modul) Pfad hinzu, und Sie erhalten als Ergebnis einen ungültigen Pfad zur Ressource. Ich würde es ändern in " $ {project.basedir} $ {file.separator} src $ {file.separator} main $ {file.separator} webapp" –

+0

Auch gibt es eleganter Weg um auf die Ressource zuzugreifen. Versuchen Sie Folgendes "getClass(). GetClassLoader(). GetResourceAsStream ("/WEB-INF/web.xml ")". Sie können Root-Verzeichnis durch OS-unabhängiges ersetzen, indem Sie die Datei # listRoots-Methode verwenden –