@WithMockUser
어노테이션을 사용하여 테스트 메서드에서 임의의 사용자로 실행할 수 있다.
@Test
@WithMockUser(username = "user1", roles = "USER")
public void testMethod() {
}
https://sasca37.tistory.com/291
Spring Security 테스트 환경에서 UserDetailsImpl
사용
문제
테스트 코드 실행 시 ClassCastException
발생
@WithMockUser
를 사용하면 SecurityContextHolder
에 설정되는 Authentication
객체의 principal
은 스프링 시큐리티의 기본 UserDetails
구현(org.springframework.security.core.userdetails.User
)으로 설정된다.UserDetailsImpl
로 형변환을 시도하면 예외가 발생한다.해결 방법
테스트 메서드 내에서 직접 SecurityContextHolder
설정
@BeforeEach
void SecurityUserTest() {
User user = new User();
user.setUsername("bin0016");
user.setPassword("Bin@12345");
user.setRole(UserRoleEnum.USER);
UserDetailsImpl userDetails = new UserDetailsImpl(user);
Authentication authentication =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
@Test
void escapeTest() {
// given
// when
ResponseEntity<MessageDto> result =userService.escape();
// then
assertThat(result).isEqualTo(new ResponseEntity<>(new MessageDto("회원 삭제 성공"), null, HttpStatus.OK));
}
@WithMockUser
나 다른 모의 보안 어노테이션을 사용할 때 해당 어노테이션이 설정하는 보안 컨텍스트가 테스트의 요구 사항과 일치하는지 확인해야한다.