2013-08-15 10 views
5

Ich entwickle eine Spring MVC 3.2 Webanwendung und versuche, die neuen MockMvc Testprogramme in meinen Komponententests zu verwenden. Ich möchte sowohl die einzelnen Controller testen als auch, dass die gesamte Webanwendung meine Spring-Konfigurations-XML-Dateien lädt. Von der Javadoc sieht es so aus, als ob ich standaloneSetup für die ehemalige und webAppContextSetup für die letztere verwenden möchte.Kann ich MockMvcBuilders.standaloneSetup() konfigurieren, um meine Nachrichtenkonverter-XML-Konfiguration zu verwenden?

Allerdings stoße ich auf ein Problem, wenn mein Controller nach Nachrichtenkonvertern sucht, um die Ausgabe zu konvertieren. Meine Interpretation des Javadoc für die StandaloneSetup Methode scheint nicht korrekt zu sein. Hier ist das Javadoc für diese Methode:

Erstellen Sie ein MockMvc, indem Sie eine oder mehrere @ Controller-Instanzen registrieren und die Spring MVC-Infrastruktur programmgesteuert konfigurieren. Dies ermöglicht die vollständige Kontrolle über die Instanziierung und Initialisierung von Controllern und deren Abhängigkeiten, ähnlich wie bei Unit-Tests, wobei gleichzeitig auch ein Controller einzeln getestet werden kann. Wenn diese Option verwendet wird, wird die Mindestinfrastruktur, die das DispatcherServlet benötigt, um Anforderungen mit annotierten Controllern zu bedienen, automatisch erstellt und kann angepasst werden. Dies führt zu einer Konfiguration, die der MVC-Java-Konfiguration entspricht, außer mit Builder-Methoden .

Wenn die Spring MVC-Konfiguration einer Anwendung relativ unkompliziert ist, z. B. bei Verwendung des MVC-Namespace oder der MVC-Java-Konfiguration, ist die Verwendung dieses Builders möglicherweise eine gute Option zum Testen der meisten Controller. Eine viel kleinere Anzahl von Tests kann verwendet werden, um sich auf das Testen und Überprüfen der tatsächlichen Spring MVC-Konfiguration zu konzentrieren.

Ich hatte interpretiert "minimale Infrastruktur" und "und ihre Abhängigkeiten" zu bedeuten, dass die Controller, die ich angeben würde zusätzlich zu all ihren Abhängigkeiten geladen werden, die ich jedoch die Nachrichtenkonverter enthalten. Dies scheint jedoch nicht der Fall zu sein. Ich brauche eine benutzerdefinierte Konfiguration für 2 Anforderungen:

  1. Ein PUT Operation, die „application/json“ verbraucht, die in ein POJO mit einem Joda Datetime-Feld umgewandelt wird. Aus diesem Grunde, ich bin auch die folgend in meiner Spring-Konfiguration:

    <mvc:annotation-driven> 
        <mvc:message-converters> 
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
         <property name="objectMapper" ref="myObjectMapper" /> 
        </bean> 
        </mvc:message-converters> 
    </mvc:annotation-driven> 
    

    Dies funktioniert gut mit webAppContextSetup aber wenn ich standaloneSetup verwenden mag es sieht aus wie ich brauche, um manuell zu erstellen und konfigurieren Sie ein MappingJackson2HttpMessageConverter konfiguriert mit meiner benutzerdefinierten ObjectMapper, die die JodaModule registriert.

    standaloneSetup(myController).setMessageConverters(myJsonConverter).build(); 
    
  2. Eine GET-Operation, die "application/custom + xml" erzeugt. Wenn ich webAppContextSetup lade, funktioniert dies ohne zusätzliche Konfiguration. Wenn jedoch lade ich standaloneSetup, was Spring-Konfiguration, die zuvor passiert ist nicht passiert, und ich sehe die folgende Fehlermeldung:

    org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
    

    Kann jemand beschreiben, was hier geschieht?Gibt es einige versteckte oder standardmäßige Nachrichtenkonverter, die beim Aufruf von webAppContextSetup enthalten sind, aber wenn ich den obigen Code anrufe, überwinde ich diese Konverter irgendwie? Wie kann ich sie einbeziehen?

Gibt es einen einfacheren Weg, um mit MockMvc für das Einrichten eines einzigen Controller und alle Konfigurations innerhalb mvc: Annotation-driven? Kann ich MockMvcBuilders.standaloneSetup() so konfigurieren, dass meine Nachrichtenkonverter-XML-Konfiguration verwendet wird, anstatt sie manuell zu konfigurieren?

+0

haben Sie versucht, die Nachrichtenkonverter über StandaloneMockMvcBuilder # setMessageConverters zu setzen? Gemäß JavaDoc können Sie diese Methode verwenden, um die Nachrichtenkonverter für die Verwendung in Argument-Resolvern und Rückgabewert-Handlern festzulegen – dade

Antwort

0

Ich glaube nicht, dass es einen einfacheren Weg gibt. Sie müssen jeden Konverter manuell über StandaloneMockMvcBuilder#setMessageConverters registrieren. Dies ist sinnvoll, weil Sie in Ihrer XML-Konfiguration dasselbe tun. Beachten Sie, dass dies bei Verwendung einer Java @Configuration Klasse gleich wäre.

Die Standalone-Konfiguration ist so konzipiert, dass möglichst wenige Komponenten geladen werden. Dies kommt einem Komponententest im Frühlingstest am nächsten. Wenn es ein Komponententest ist, den Sie möchten, sollten Sie jede Abhängigkeit (einschließlich Konverter) des Controllers, den Sie testen werden, mit einem spöttischen Framework wie überspielen.

Sie können ein Beispiel finden here (es ist ein didaktisches Projekt für die Universität geschrieben).