본문 바로가기

Backend/SpringBoot

단위 테스트에 Spring Securiy 인증 관련 어노테이션들 사용하기

🔐 들어가며

안녕하세요! 이번 포스팅에서는 테스트할 때 Spring Security 인증을 할 수 있게 제공되는 어노테이션들을 소개하려고 합니다. 이 포스팅에서 다루는 어노테이션 목록은 다음과 같습니다.

  • @WithMockUser : UserDetail 생성
  • @WithAnonymousUser : 익명의 유저 생성
  • @WithUserDetails : UserDetail 조회

👻 의존성 추가

testCompile('org.springframework.security:spring-security-test')
testCompile("org.springframework.boot:spring-boot-starter-test")

위 어노테이션들을 사용하기 위해 반드시 필요한 spring security test와, JUnit4를 사용하기 위해 필요한 starter test를 추가해줍니다.


👀 어노테이션 소개

@WithMockUser

위 어노테이션은 지정한 사용자 이름, 패스워드, 권한으로 UserDetails를 생성한 후 보안 컨텍스트를 로드합니다. 값을 지정하지 않을 시에는 아래와 같은 기본 값을 가지게 됩니다.

  • username : user
  • roles : ROLE_USER
  • password : password
@WithMockUser(username = "테스트계정", password = "custom_password", roles = {"USER","ADMIN"})
@Test
public void testSecurity() throws Exception {
     // test code
}

@WithMockUser

roles에는 접두사로 ROLE_이 붙게 되는데, 접두사를 제외하고 싶으면 authorities 속성을 사용하면 됩니다.

 

@WithAnonymousUser

익명의 사용자로 테스트하고 싶을 때 사용합니다.

@WithAnonymousUser
@Test
public void testSecurity() throws Exception {
  // test code
}

@WithAnonymousUser

 

@WithUserDetails

지정한 사용자 이름으로 계정을 조회한 후에 UserDetails 객체를 조회하여 보안 컨텍스트를 로드하게 됩니다.

  • value : 지정한 사용자 이름. 기본값은 user
  • userDetailsServiceBeanName : UserDetails 조회 서비스의 빈 이름. 하나밖에 없다면 굳이 적지 않아도 된다.
@WithUserDetails(value = "test@a.b", userDetailsServiceBeanName = "userService")
@Test
public void testSecurity() throws Exception {
  // test code
}

@WithUserDetails

 

만약 테스트 시작 전에 유저 데이터를 임의로 넣어놓고 싶다면, @Before 대신 @BeforeTransaction을 사용해야 합니다.@WithUserDetails@Before전에 실행되어서 유저 데이터를 넣기 전에 조회를 하기 때문입니다.

@Transactional
// ...
public class UserControllerTest {

  @Autowired
  public UserRepository userRepository;
  private Long TEST_ACCOUNT_CODE;

  @BeforeTransaction
  public void accountSetup() {
    TEST_ACCOUNT_CODE = userRepository.save(UserInfo.builder()
        .email("test@a.b")
        .auth("ADMIN")
        .password("password").build()).getCode();
  }

  @AfterTransaction
  public void accountCleanup() {
    userRepository.deleteById(TEST_ACCOUNT_CODE);
  }

  @WithUserDetails(value = "test@a.b")
  @Test
  public void testSecurity() throws Exception {
      // test code 
    }
}

위 코드처럼 @BeforeTransaction을 사용해서 설정을 해주니 원하는대로 유저 정보 생성 - 조회의 순서를 거쳐 테스트를 진행했습니다. (이게 맞는 방법인지는 모르겠네요 ... 😅 혹시 아시는 분 있으면 댓글 부탁드립니다!)

 


✨ 맺으며

간편하게 사용할 수 있는 Spring Security 테스트 인증 관련 어노테이션들을 알아보았습니다.

혹시 글을 읽으면서 잘못된 내용이 있으면 댓글로 알려주시면 감사하겠습니다! 읽어주셔서 감사합니다! 😊

 


👏 참고링크