Enterprise Java
Mocking Spring Security Context for Unit Testing
Today, while writing unit test case for one of the Java method which looks like below:
public ApplicationUser getApplicationUser() {
ApplicationUser applicationUser = (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return applicationUser;
}I want to mock Spring Security Context to get the Principal, to achieve the same I mocked each level of method calls as follows:
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
import org.mockito.MockitoAnnotations;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import com.arpit.security.user.ApplicationUser;
public class BaseTest {
@Before
public void setupMock() {
MockitoAnnotations.initMocks(this);
}
@Test
public void mockApplicationUser() {
ApplicationUser applicationUser = mock(ApplicationUser.class);
Authentication authentication = mock(Authentication.class);
SecurityContext securityContext = mock(SecurityContext.class);
when(securityContext.getAuthentication()).thenReturn(authentication);
SecurityContextHolder.setContext(securityContext);
when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser);
}
}| Reference: | Mocking Spring Security Context for Unit Testing from our JCG partner Arpit Aggarwal at the Arpit Aggarwal blog. |





Thanks very much for that information, it save my today.
Nice to hear this Angel Luis Fernandez Benot, I appreciate if you share your feedback on the original post as well – https://aggarwalarpit.wordpress.com/2017/05/17/mocking-spring-security-context-for-unit-testing/
The last line of the test method, i.e.:
when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser);can be replaced by:
when(authentication.getPrincipal()).thenReturn(applicationUser);