[Spring Boot] How to stub @AuthenticationPrincipal argument with Spring-Security in Unit Tests

There may be some situations where user information is required as part of business logic. Quite often, this process takes place after authentication. In this article, let us find out how user information can be obtained as well as how to write unit tests for such cases.

First of all, let us look at a sample controller below. Using Spring Security it is possible to obtain information of the current logged-in user by using @AuthenticationPrincipal.

For the purpose of testing, we hope to invoke /username endpoint to get the username. But unlike @RequestParam or @PathVariable (where we can inject right into the URL) or @RequestBody (where we can pass in the content and content type) injecting user information might not seem natural.

When using MockMvc, it is possible to resolve custom argument and let us see how to do that. For this, let us create a custom argument resolver class where it returns a pre-defined user information. This seems adequate because when using JWT token, the token is likely to be verified before the reaching the implementation of the /username endpoint.

Lastly, the custom argument resolver class can be used when setting up MockMvc with setCustomArgumentResolvers() method.

Welcome to Jay’s blog. This blog is for myself to keep notes. Feel free to take a look and share.