Write Junit testet für die Spring MVC-Anwendung, die intern auf ContextLoader.getCurrentWebApplicationContext () beruht

8

Ich versuche, Integrationstests für einen Controller in unserer Federmvc-Anwendung zu schreiben. Der Controller ruft eine Serviceklasse auf, die wiederum einen Dao zum Lesen / Schreiben von Daten aus dem Repository aufruft. Das DAO muss eine Konfiguration suchen. Die Konfigurations-Bean ist in WEB-INF / applicationContext.xml definiert.

Ich benutze so etwas:

Konfiguration config = (Konfiguration) ContextLoader.getCurrentWebApplicationContext (). getBean ("config");
private String namespace = config.getProperty ("someproperty");

Die Eigenschaften sind im Tierpfleger gespeichert, daher verwende ich keine Property-Management-Artefakte von spring.

Das Problem ist, dass beim Ausführen des JUnit-Tests ContextLoader.getCurrentWebApplicationContext () immer null zurückgibt.

Ich habe bisher die folgenden Ansätze betrachtet:
1. Ted Youngs Ansatz (nur Google-Suche nach Spring-Mvc-Integration testet jung)
2. Ссылка
3. Diese Seite .. Fragen / 8464919 / Unit-Test-a-Servlet-das-hängt-auf-Federn-Webapplicationcontextutils-getre
4. Verwenden Sie Selenium / JWebunit
5. Ссылка

1 löst dieses Problem nicht. WebApplicationContext bleibt null
2 gibt an, dass die Unterstützung für WebApplicationContext im Frühjahr 3.2 verfügbar sein wird 3. Ich verstehe das nicht. Woher bekomme ich testApplicationContext und getServletContext () von?
4. Ich möchte diesen Weg nicht gehen, da dies ein Blackbox-Test ist 5. Ich schaue gerade auf 5. Aber das erfordert den Start eines Servlet-Containers. Gibt es keine andere Alternative?

Ich freue mich über jede Hilfe, die Sie leisten können.

Danke PixalSoft

@Ted Young SO erlaubte mir nicht, das zu beenden, was ich gesagt habe. Mit loader = MockWebApplicationContextLoader soll es nicht als Standard Contextloader verfügbar sein, genau wie sich der Spring ContextLoader verhält, wenn die Webapp von einem Servletcontainer initialisiert wird ? Gibt es etwas Besonderes, was ich tun muss, um den MockWebApplicationContextLoader in den Griff zu bekommen? Das Einfügen des config-Objekts funktioniert für Singleton-Objekte. Aber alles kann nicht Singleton sein. Das Übergeben eines Konfigurationsobjekts in jedem Konstruktor klingt zu langwierig. Für den Moment habe ich eine Klasse erstellt, die ein statisches Konfigurationsobjekt besitzt, das über eine Setter-Methode autowirded wird. Ich werde ApplicationContextAware.Many thx

betrachten     
user1373927 04.05.2012, 01:43
quelle

4 Antworten

3

Fügen Sie den folgenden Code am Anfang Ihres Junit-Tests hinzu:

%Vor%

Wenn Sie mehr als ein XML für den Kontextpfad hinzufügen müssen, fügen Sie sie einfach in dieselbe Zeichenfolge ein, die durch Leerzeichen getrennt ist:

%Vor%     
qwertzguy 12.02.2013 11:00
quelle
3

Sie müssen den WebApplication-Kontext manuell zu ContextLoderListner hinzufügen. Das wird funktionieren.

%Vor%     
Shiran 18.09.2015 04:43
quelle
1

Der Grund, warum ContextLoader.getCurrentWebApplicationContext NULL zurückgibt, liegt darin, dass Sie bei Verwendung von MockWebApplicationContextLoader weder einen Webanwendungskontext noch diese bestimmte ContextLoader-Implementierung verwenden.

Da Ihr Repository von Spring verwaltet wird, injizieren Sie das config-Objekt einfach in das Repository. Das Eingeben des Konfigurationsobjekts ist die am besten geeignete Methode, um darauf zuzugreifen. Sie können dann Ihre Namespace-Eigenschaft in einer mit @PostConstruct annotierten Methode initialisieren.

Alternativ könnte Ihre DOA ApplicationContextAware implementieren, um während der Erstellung eine Kopie des Anwendungskontexts zu erhalten.

    
Ted Young 05.05.2012 00:15
quelle
0

Speichern Sie Ihre Eigenschaftendatei in Ihrem Klassenpfad.

Greifen Sie nun wie folgt auf diese Eigenschaft in Ihrer Controller-Klasse zu:

%Vor%

Jetzt können Sie auf Ihre Eigenschaftendatei zugreifen.

Ich bin sicher, es wird funktionieren.

    
JOHND 04.05.2012 09:15
quelle

Tags und Links