Spring-Test-MVC / MockServletContext - Der Inhalt ist im Test leer, arbeitet aber auf Tomcat

8

Wir versuchen, Spring-Test-MVC für unsere Spring-MVC-Webanwendung einzurichten. Wir begannen mit Freemarker und alles war in Ordnung. Wir haben uns jedoch dagegen entschieden und versuchen nun, es mit JSP einzurichten. Wenn die Test-App auf einem Tomcat bereitgestellt wird, funktioniert sie. Wenn wir den einfachen Test ausführen:

%Vor%

es sagt: content type not set oder wenn das entfernt wird, wird der Inhalt einfach leer sein. Der Controller wird jedoch aufgerufen, also muss das Mapping funktionieren.

Dies legt also stark nahe, dass die Ansicht für unsere Tests nicht gerendert wird, aber ich habe keine Ahnung, welche Einrichtung ich vermisse.

Hier ist unsere servlet-context.xml:

%Vor%

Der WebContextLoader:

%Vor%

GenericWebContextLoader ist das Original von Spring-Test-mvc.

Der MockMvc wird als Bean wie folgt eingerichtet:

%Vor%

Das ist also das Setup. web.xml wird vom Testframework nicht verwendet und sollte nicht so sein, wie es vorher funktioniert hat.

Ich denke, dass es im Servlet-Kontext ein zusätzliches Setup geben muss. Es wird geladen, das habe ich überprüft, aber während es für die Tomcat Deployed App wichtig ist, was ich für Präfix und Suffix eingestellt habe, wird es vom Test einfach ignoriert.

Ich bin mir nicht sicher, wie sehr die Fehlerverfolgung helfen wird, aber hier ist es:

%Vor%

Und die Testausgabe:

%Vor%

Also vielen Dank für irgendwelche Vorschläge, die mir helfen, das Problem zu lokalisieren!

Übrigens: Ich wollte nicht, dass das länger wird, also habe ich den Pom übersprungen. Wir verwenden Spring 3.1, Spring-Test-MVC 1.0.0..BUILD-SNAPSHOT, JSP-AP 2.2, JSTL 1.2, ... Wenn Sie mehr wissen möchten, werde ich versuchen, es irgendwo hochladen ...

Bearbeiten

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen oder warum Sie meine Frage nicht beantworten können. Wirklich müssen es herausfinden, und ich habe keine Ahnung, wo ich anfangen soll. So sind auch Gedanken oder Kommentare willkommen.

Bearbeiten2

Verwendet die Druckmethode mit der folgenden Ausgabe:

%Vor%

Was nur das Problem besser zeigt, aber nicht die Lösung ...

edit3

Habe gerade folgendes herausgefunden:

JSP benötigt einen Servlet-Container. So scheint es, dass ich meine Seiten nicht so testen kann ... Wenn jemand eine Idee hat, wie man dieses Problem umgehen kann, lass es mich wissen ..

    
Pete 15.06.2012, 07:55
quelle

3 Antworten

1

Hinzufügen zu Ihrem edit3, im Wesentlichen für JSP-Rendering ist der letzte Aufruf

%Vor%

und die RequestDispatcher -Implementierungen werden vom Container bereitgestellt (da es davon abhängt, wie die Jsps kompiliert werden müssen, wo die kompilierten Jsps usw. platziert werden sollen). Die Mock-Implementierung von RequestDispatcher erfasst einfach die weitergeleitete JSP-Seite, und Sie können nur überprüfen, ob der Pfad zur JSP dem entspricht, was Sie erwarten.

    
Biju Kunjummen 15.06.2012, 12:43
quelle
8

@Biju - Ich weiß diese Antwort zu schätzen, und das hat mir eine Reise erspart, und ich versuche nicht, den Boten hier zu erschießen, aber ich muss sagen, dass jemand im Spring-Team motiviert ist, etwas aufzubauen besser, ich finde MockMVC, um eine Übung in Trivialität und Sinnlosigkeit zu sein. Erstens wird die Spring-Authentifizierung nicht direkt unterstützt. OK, fair genug, wenn Sie StackOverflow durchsuchen, können Sie eine Abhilfe dafür finden. Dann habe ich festgestellt, dass, wenn Sie in Ihrem Spring Kontext Konfiguration haben, jeder Pfad, den Sie aufbauen können, als "OK" zurückkommt, selbst wenn es "notFound" zurückgeben sollte. OK, was auch immer, nimm das raus und lass uns nie wieder davon sprechen. :) Und jetzt komm um herauszufinden, dass MockMVC wirklich nur MockMC ist - es findet keine Ansichtsverarbeitung statt. Am Ende des Tages, wofür diese Software gut ist, testet man Anwendungen, die weder Sicherheit noch Views enthalten - was wären genau die JSON-Anwendungen für Spielzeug?

Und das ist nicht wirklich eine Antwort, es ist eine Tirade, was bedeutet, dass MockMVC mich jetzt auch StackOverflow-Reputation kosten wird! :) Hulk zerschlagen!

[EDIT] - OK, abgesehen davon sieht es aus, als gäbe es Möglichkeiten, dies zu umgehen. [LATER EDIT] Leider ist der Weg, den ich gefunden habe, nicht mehr verfügbar.

    
John Lockwood 20.01.2014 18:40
quelle
0

Ich habe eine modifizierte Version von MockRequestDispatcher erstellt, die die gleiche Kette wie MockMvc erstellt und die Anfrage an diese Kette weiterleitet. Das behebt dieses Problem für mich. Etwas mehr Arbeit muss getan werden, wenn die Ansicht außerhalb des Dispatcher-Servlets gerendert wird (z.B. über jsp).

Der Code ist da: Ссылка

Die meiste Arbeit war es, es an der richtigen Stelle zu injizieren. Ich habe das gemacht, indem ich einen RequestPostProcessor für MockMvc und etwas Mockito-Magic erstellt habe, das den MockHttpServletRequest.getRequestDispatcher-Aufruf abfängt.

Um es zu verwenden, fügen Sie es zu Ihrem Testklassenpfad hinzu und rufen Sie es direkt nach dem Erstellen Ihrer MockMvc-Instanz auf:

%Vor%     
Michael Wyraz 17.09.2015 10:25
quelle