728x90
안녕하세요.
Spring-Security를 사용해서 로그인 인증 기능에 대한 테스트 방법에 대해서 알아보고자 합니다.
테스트 환경
- JUnit4
- MockMvc를 빈으로 주입받아 mock 테스트를 했습니다.
- 사전에 회원가입에 대한 테스트 코드가 필요합니다.
테스트코드에서 로그인 인증에 사용할 주요 메서드
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.authenticated;
authenticated()
authenticated()를 사용해서 테스트하면, Security를 통해서 로그인만 되면, 해당 테스트 코드는 통과됩니다.
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated;
unauthenticated()
Security를 통해서 로그인이 안된 경우에는 unauthenticated()메서드를 사용해서 테스트하면 됩니다.
테스트 코드
- 테스트 코드
- 제가 직접 작성한 "로그인 후에 이메일 재인증 요청페이지 테스트코드"(통과)
@DisplayName("이메일 재인증 페이지 정상 작동 확인")
@Test
public void 이메일재인증요청페이지_정상() throws Exception {
//회원가입하고..
Account account = Account.builder().nickname("wewewew").email("asdf@email.com").password("123123123").build();
Account savedAccount = accountRepository.save(account);
//로그인하고..
accountService.login(savedAccount);
//테스트
mockMvc.perform(get("/recheck-email"))
.andExpect(status().isOk())
.andExpect(view().name("account/recheck-email"))
.andExpect(authenticated());
}
accountService.login(saveAccount)메서드의 경우,
1. UsernamePasswordAuthenticationToken을 생성하였고,
2. SecurityContext 객체를 SecurityContextHolder.getContext()를 통해서 만들어 주었고,
3. SecurityContext객체의 setAuthentication()에 파라미터로 UsernamePasswordAuthenticationToken을 넣어서 Security로부터 로그인을 받았습니다.
- 테스트 대상 요청 메서드
@GetMapping("/recheck-email")
public String checkEmail(@CurrentUser Account account, Model model){
model.addAttribute("email", account.getEmail());
model.addAttribute("nickname", account.getNickname());
return "account/recheck-email";
}
- @CurrentUser 어노테이션은 새로 정의한 어노테이션입니다.
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : account")
Get 요청으로 "/recheck-email"을 요청하게 되면, Principal로 잡힌 로그인된 계정 객체를 참조하게 됩니다. 만약 계정 객체가 "null"이면, "redirect:/login"으로 자동으로 넘어가게 됩니다.
728x90
'SpringBoot > 테스트코드' 카테고리의 다른 글
단위테스트에서 FK관계에서 발생한 DataIntegrityViolationException 에러 (0) | 2020.08.20 |
---|---|
[Springboot 단위테스트]MockMvc Bean을 주입받지 못하는 에러 (0) | 2020.07.26 |
JUnit4와 JUnit5의 차이점. (0) | 2020.07.19 |
[JUnit4-5]JUnit 버전에 따른 어노테이션 사용법 (0) | 2020.07.11 |
[JUnit]MVC 테스트 어노테이션 알아보기 (0) | 2020.07.05 |
댓글