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
.
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% Dies kann durch Injektion von HandlerMethodArgumentResolver
in Ihren Mock MVC-Kontext oder Standalone-Setup erfolgen. Angenommen, Ihre @AuthenticationPrincipal
ist vom Typ ParticipantDetails
:
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:
Dies führt dazu, dass Ihre mit @AuthenticationPrincipal
annotierten Methodenargumente mit den Details aus Ihrem Resolver ausgefüllt werden.
Tags und Links java spring spring-mvc spring-security spring-test