Einrichten von MockMvc mit @WebMvcTest im Spring Boot 1.4 MVC Testing

10

Ich habe wenig Arbeitscode, um MockMVc auf verschiedene Arten mit dem neuen Spring Boot 1.4 @WebMvcTest einzurichten. Ich verstehe den StandaloneSetup-Ansatz. Was ich wissen möchte, ist der Unterschied zwischen dem Einrichten von MockMvc bis WebApplicationContext und dem automatischen Starten von MockMvc .

Code-Snippet 1: MockMvc durch WebApplicationContext Setup

%Vor%

Gemäß der Dokumentation WebMvcTest API, Standardmäßig werden Tests, die mit @WebMvcTest versehen sind, auch Spring Security und MockMvc automatisch konfigurieren. Also habe ich hier einen 401 Unauthorized Status Code erwartet, aber der Test wird mit einem 200 Status Code bestanden.

Als nächstes probierte ich die automatische Verdrahtung MockMvc , aber der Test schlägt mit 401 Unauthorized Statuscode fehl, es sei denn, ich füge @AutoConfigureMockMvc(secure=false) hinzu oder aktualisiere die @WebMvcTest Annotation, um die Sicherheit zu deaktivieren:

%Vor%


Es folgt der Code, der NUR NACH dem expliziten Deaktivieren der Sicherheit weitergegeben wird.

Code-Snippet 2: MockMvc durch Autowiring

%Vor%

Meine Fragen sind also:

  1. Warum hat Code-Snippet 1 keinen 401-Statuscode-Fehler gemeldet, während die automatische Verkabelung MockMvc ausgeführt hat. Wiederholen Sie auch, was das offizielle Dokument sagt Standardmäßig werden Tests, die mit @WebMvcTest versehen sind, auch Spring Security und MockMvc automatisch konfigurieren. Aber in diesem Fall scheint @WebMvcTest nichts mit der automatischen Konfiguration zu tun zu haben Spring-Sicherheit (weil Code-Snippet 1 ohne 401-Fehler übergeht). Es läuft schließlich darauf hinaus, wie ich das MockMvc aufstelle. Habe ich hier Recht?

  2. Was sind die Unterschiede / Ziele zwischen beiden Ansätzen?

  3. Wie unterscheidet sich das Deaktivieren der Sicherheit über @AutoConfigureMockMvc(secure=false) von dem durch @WebMvcTest(controllers = IndexController.class, secure = false) ? Welche ist die bevorzugte Annäherung oder wann (oder wo), um sie zu verwenden?

user2693135 03.07.2016, 08:33
quelle

3 Antworten

6

Ich stoße auch auf ein ähnliches Problem. @WebMvcTest konfiguriert automatisch Spring Security mit Basic Auth, aber ich habe eine WebSecurityConfig-Klasse, die WebSecurityConfigurerAdapter erweitert. In dieser Klasse habe ich Basic Auth und Token Base Security deaktiviert. Das bedeutet, dass die WebSecurityConfig-Klasse nicht zum Konfigurieren von Spring Security verwendet wird.

Um das Problem zu beheben, habe ich @ContextConfiguration zu meiner Komponententestklasse hinzugefügt und Abhängigkeiten der WebSecurityConfig-Klasse hinzugefügt.

%Vor%     
UmitYeldan 10.09.2016 15:59
quelle
6

Laut diesem Thema in GitHub

Ссылка

@WebMvcTest Auto konfiguriert standardmäßig eine grundlegende Auth, wenn der Spring-Security-Test im Klassenpfad ist

Beantworten Sie Ihre Fragen:

  1. Im Code-Snippet 1 haben Sie MockMvc nicht in Ihre Testklasse eingefügt. Sie sollten im Builder der Setup-Methode .apply (springSecurity ()) hinzufügen, damit Spring die Basiskonfiguration verwendet (nicht Ihre benutzerdefinierte Sicherheitskonfiguration) wenn du einen hast)
  2. Beide Ansätze machen im Prinzip dasselbe, der Unterschied ist, dass die zweite mit der Basisauth bereits im MockMvc kommt, deshalb müssen Sie secure = false
  3. verwenden
  4. Aus der Dokumentation:
  

Standardmäßig werden Tests, die mit @WebMvcTest mit Anmerkungen versehen sind, automatisch konfiguriert   Spring Security und MockMvc (Unterstützung für HtmlUnit WebClient   und Selenium WebDriver). Für eine feinere Kontrolle von MockMVC   @AutoConfigureMockMvc Annotation kann verwendet werden.

    
Marco Prado 18.09.2016 06:51
quelle
2

Ich bin mir nicht sicher, ob das direkt damit zusammenhängt, aber es gibt einen ausstehenden Fehler Wenn Sie Spring Boot und @WebMvcTest verwenden, wird Ihre benutzerdefinierte @EnableWebSecurity config-Klasse ignoriert. Einige Problemumgehungen werden im Fehlerbericht erwähnt. Ich benutze:

%Vor%     
djeikyb 26.06.2017 03:36
quelle