Führen Sie Unit-Tests auf Controllern durch, die eine Authentifizierung erfordern

7

Ich habe eine Spring-Boot-Anwendung, die eine Anmeldung für einige Aktionen erfordert. Ich versuche, sie mit MockMvc zu testen, aber es scheint nicht zu funktionieren. Ich bekomme immer eine HTTP-Antwort mit Status 403 (verboten). Wahrscheinlich stimmt etwas mit dem Authentifizierungsteil nicht.

Ich habe versucht, der Dokumentation zu folgen, aber Ich konnte es nicht funktionieren.

Dies ist mein aktueller Testcode:

%Vor%

Tut mir leid, wenn mir etwas offensichtlich fehlt. Dies ist meine erste Erfahrung mit Spring Boot.

    
aochagavia 17.04.2015, 16:14
quelle

1 Antwort

21

Sie müssen angeben, unter welchem ​​Benutzer Sie den Test ausführen möchten. Sie haben einige Optionen (jede Option ist ein Link zur ausführlichen Dokumentation):

@WithMockUser

Diese Option erstellt einen falschen Benutzer (d. h. der Benutzer muss nicht in einem Datenspeicher vorhanden sein). Das Problem bei diesem Ansatz besteht darin, dass Sie, wenn Ihre Anwendung auf einer benutzerdefinierten Benutzerimplementierung basiert, Klassenausnahmebedingungen erhalten können. Wenn Sie keinen benutzerdefinierten Typ aus einem benutzerdefinierten UserDetailsService zurückgeben, sollte diese Lösung funktionieren.

%Vor%

@WithUserDetails

Wenn Sie einen benutzerdefinierten UserDetailsService implementiert haben, der eine benutzerdefinierte Implementierung von UserDetails zurückgibt, funktioniert diese Lösung möglicherweise für Sie.

Damit es funktioniert, müssen Sie einen UserDetailsService als Bean verfügbar machen und der Benutzer muss existieren. Zum Beispiel:

%Vor%

@WithSecurityContext

Dies ist das Beste aus beiden Welten, erfordert aber ein wenig zusätzliches Setup. Wenn Sie über einen benutzerdefinierten UserDetailsService verfügen, der eine benutzerdefinierte Implementierung von UserDetails zurückgibt und der Benutzer NICHT unbedingt existieren muss, können Sie diese Methode verwenden. Ich lasse Sie die Dokumentation zu diesem Setup lesen, da es etwas länger und gut dokumentiert ist.

Verwendung eines RequestPostProcessors

Wenn Anmerkungen nicht Ihr Ding sind, können Sie einen RequestPostProcessor verwenden. Zum Beispiel:

%Vor%     
Rob Winch 17.04.2015, 16:52
quelle