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
betrachtenDer 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.
Tags und Links spring-mvc