Spring Security를 적용하기 전 테스트 코드는 mockMvc를 사용하여 application context를 web application context 환경(브라우저나 WAS의 동작을 똑같이 처리해줄 수 있는 환경)으로 테스트했다.
스프링 시큐리티는 WithSecurityContextTestExecutionListener로 스프링 테스트와 연결된다. 이 리스너는 SecurityContextHolder를 채워 올바른 사용자로 테스트를 실행할 수 있게 한다. 풀어서 설명하면 위 리스너는SecurityContextHolder를 통해 SecurityContext에 생성한다. SecurityContext는 Authentication 객체가 저장되는 보관소로 필요 시 객체를 꺼내 사용할 수 있다.
테스트 시 사용자 인증을 자동으로 완료 후 진행되도록 하려면 WithSecurityContextTestExecutionListener에 의해 등록된 SecurityContext에 Authentication을 등록하여 시큐리티가 인증에 사용할 수 있게 하면 된다.
SecurityContext에 Authentication을 등록하는 방법은 여러 가지 있다.
이 애노테이션은 Mock User(스프링 시큐리티의 User 객체)를 만들어 등록한다.
SecurityContext에 채워지는 Authentication은 UsernamePasswordAuthenticationToken이다.
username, password, roles 등을 설정하여 등록할 수 있다.
익명 사용자로 테스트를 실행할 수 있다.
WithMockUser를 사용하면 Authentication principal을 UserDetails의 구현체 중 하나인 User로 만든 authentication밖에 사용할 수 없기에 커스터마이징이 안 된다. @WithUserDetails는 내가 만든 UserDetails 클래스로 사용자 등록이 가능하다.