Inject @AuthenticationPrincipal beim Komponententest eines Spring-REST-Controllers

9

Ich habe Probleme, einen Restendpunkt zu testen, der ein UserDetails als einen mit @AuthenticationPrincipal annotierten Parameter erhält.

Es sieht so aus, als ob die im Testszenario erstellte Benutzerinstanz nicht verwendet wird, stattdessen wird stattdessen versucht, den Standardkonstruktor zu verwenden: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.andrucz.app.AppUserDetails]: No default constructor found;

REST-Endpunkt:

%Vor%

Testklasse:

%Vor%

Wie kann ich dieses Problem lösen, ohne zu webAppContextSetup wechseln zu müssen? Ich würde gerne Tests schreiben, die die volle Kontrolle über Service-Mocks haben, also verwende ich standaloneSetup .

    
andrucz 12.07.2016, 13:40
quelle

2 Antworten

4

Aus irgendeinem Grund funktionierte Michael Piefels Lösung nicht für mich, also habe ich eine andere gefunden.

Erstellen Sie zuerst eine abstrakte Konfigurationsklasse:

%Vor%

Dann können Sie Tests wie folgt schreiben:

%Vor%

Und @AuthenticationPrincipal sollte Ihre eigene Benutzerklassen-Implementierung in die Controller-Methode einfügen

%Vor%     
pzeszko 27.02.2017 12:55
quelle
3

Dies kann durch Injektion von HandlerMethodArgumentResolver in Ihren Mock MVC-Kontext oder Standalone-Setup erfolgen. Angenommen, Ihre @AuthenticationPrincipal ist vom Typ ParticipantDetails :

%Vor%

Dieser Argument-Resolver kann den Typ ParticipantDetails verarbeiten und erstellt ihn einfach aus der Luft, aber Sie sehen, dass Sie eine Menge Kontext bekommen. Später wird dieser Argument-Resolver an das Schein-MVC-Objekt angefügt:

%Vor%

Dies führt dazu, dass Ihre mit @AuthenticationPrincipal annotierten Methodenargumente mit den Details aus Ihrem Resolver ausgefüllt werden.

    
Michael Piefel 30.01.2017 15:21
quelle