Spring Security, JUnit: @WithUserDetails for user created in @Before

fNek picture fNek · Feb 26, 2017 · Viewed 8.1k times · Source

In JUnit tests with Spring MockMVC, there are two methods for authenticating as a Spring Security user: @WithMockUser creates a dummy user with the provided credentials, @WithUserDetails takes a user's name and resolves it to the correct custom UserDetails implementation with a custom UserDetailsService (the UserDetailsServiceImpl).

In my case, the UserDetailsService loads an user from the database. The user I want to use was inserted in the @Before method of the test suite.

However, my UserDetailsServiceImpl does not find the user.

In my @Before, I insert the user like this:

User u = new User();
u.setEMail("[email protected]");
u = userRepository.save(u);

And in the UserDetailsServiceImpl:

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = this.userRepository.findOneByEMail(username);

    if (user == null)
        throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));
    return user;
}

How can I use an account created in @Before with @WithUserDetails?

Answer

hya picture hya · Feb 26, 2017

Unfortunately, you can't do easily @WithUserDetails with @Before, because Spring @WithUserDetails annotation will invoke Spring security context test listener before running setUp method with @Before.

Here is https://stackoverflow.com/a/38282258/1814524 a little trick and answer to your question.