Integrationstest Spring Boot mit MockMVC

10

Ich habe Probleme beim Testen einer Spring Boot-Anwendung mit MockMvc.

Ich habe die folgende Testklasse:

%Vor%

Dies führt zu einem HTTP 200 und nicht zu einem 401. Ich habe die Komponente Scannen und Autokonfiguration aktiviert und die Federsicherheit wird in meiner SecuityConfiguration-Klasse wie folgt konfiguriert:

%Vor%

Wenn ich eine restTemplate für den Zugriff auf http://localhost:8080/accounts/1 verwende, dann bekomme ich das erwartete Verhalten (HTTP 401).

Ich habe andere Beispiele gesehen (z. B. Spring Boot Setup-Sicherheit zum Testen ), die darauf hindeuten, dass ich die FilterChainProxy automatisch anwähle und den Filter manuell mit der Methode WebApplicationContext.addFilters(filterChainProxy) hinzufüge. Dies scheitert jedoch bei mir ( org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.web.FilterChainProxy] found ).

Ich habe zwei Fragen:

  1. Warum verwendet der injizierte WebApplicationContext nicht automatisch die SpringSecurity-Filter? Selbst wenn ich den FilterChainProxy abrufen und manuell hinzufügen könnte, gibt der JavaDoc für EmbeddedWebApplicationContext
  2. an
  

beliebige {@link Servlet} oder {@link Filter} Beans, die im Kontext definiert sind, werden automatisch mit dem eingebetteten Servlet-Container registriert

Als Ergebnis würde ich nicht erwarten, die Sicherheitsfilterkette manuell hinzufügen zu müssen, da ich (fälschlicherweise?) erwarte, dass dies aufgrund der automatischen Konfiguration im Spring Boot "nur funktioniert"?

  1. Warum gibt es keinen FilterChainProxy im Anwendungskontext? Auch hier sind meine Erwartungen an die AutoConfiguration vielleicht falsch - aber ich dachte, dass dies als Teil der Kontextkonfiguration konfiguriert wäre.

Vielen Dank im Voraus für einen Rat.

Bearbeitungen

  • Der Grund, warum ein FilterChainProxy nicht injiziert wird, liegt darin, dass ich meine Konfiguration auf

    eingestellt habe

    public void configure (WebSecurity Web) {     web.debug (wahr); }

Dies konfiguriert stattdessen tatsächlich ein org.springframework.security.web.debug.DebugFilter . Wie ich es nun geschafft habe, den Filter unabhängig von dieser Debug-Einstellung zu bekommen, ist wie folgt:

%Vor%

Wenn ich das wie folgt zum MockMvcBuilder hinzufüge:

%Vor%

dann funktioniert es wie erwartet.

Aber ich verstehe nicht, warum MockMVC die Filter ignorieren würde, da dies für das Testen einer Anfrage wichtig zu sein scheint, da in einem Filter alles passieren könnte, was sich auf das Ergebnis des Tests auswirken könnte. Außerdem bedeutet das, dass ich zum korrekten Testen alle Filter im Servlet-Kontext suchen und ihre Prioritäts- / URL-Zuordnung festlegen und sie entsprechend hinzufügen muss. Dies scheint fehleranfällig und unnötig.

    
David Goate 05.11.2014, 16:29
quelle

1 Antwort

5

Ich stimme zu, dass Mock MVC vielleicht eher dazu dient, Spring MVC und benutzerdefinierten Code in Controllern zu testen, wie von @ dave-syer kommentiert. In Fällen, in denen Sie die Feder-MVC-Infrastruktur gleichzeitig mit Ihrem benutzerdefinierten Controller-Code testen möchten (Korrektheit der zu URLs zugeordneten Controller; Mapping und Validierung von Eingabe- und Ausgabeobjekten; Standard-Controller; Ihre Controller), ohne den Servlet-Container zu nutzen der Stapel, MockMVC ist für dich da.

Aber MockMVC verfügt auch über Methoden zum Hinzufügen von Filtern, so dass mit der Möglichkeit ausgestattet ist, Filter in die beschriebene Art von Tests einzubinden. Manchmal kann der Filter eine funktionale Rolle für Code innerhalb eines Controllers spielen, der sonst mit MockMVC nicht testbar wäre.

Mit all dieser Theorie habe ich versucht, Boot-Verhalten für meine Tests zu imitieren, wo Filter in Spring-Boot-Art eingerichtet und von meinen Tests zur Verwendung mit MockVMC aufgenommen wurden. Hier ist ein Ausschnitt, den ich benutzt habe. Es kann sicherlich verbessert werden, um Boot-Verhalten genauer zu imitieren und zu einem benutzerdefinierten MockMVCBuilder zu extrahieren.

%Vor%     
yny 12.05.2016 18:35
quelle