인증된 사용자가 접근할 수 있는 기능 테스트하기
- 실제 DB에 저장되어 있는 정보에 대응하는 인증된 Authentication이 필요하다.
- @WithMockUser로는 처리할 수 없다.
인증된 사용자를 제공할 커스텀 애노테이션 만들기
- @WithAccount
- https://docs.spring.io/spring-security/reference/servlet/test/method.html#test-method-setup
@BeforeEach
void beforeEach() {
SignUpForm signUpForm = new SignUpForm();
signUpForm.setNickname("jungi");
signUpForm.setEmail("devjun63@gmail.com");
signUpForm.setPassword("12345678!");
accountService.processNewAccount(signUpForm);
}
@WithUserDetails(value = "devjun", setupBefore = TestExecutionEvent.TEST_EXECUTION)
// setupBefore -> 실행 순서 정해줌 BeforeEach -> WithUserDetails
// But Bug라서 WithUserDetails -> BeforeEach 순으로 실행됨
@DisplayName("프로필 수정하기 - 입력값 정상")
@Test
void updateProfile() throws Exception {
String bio = "짧은 소개를 수정하는 경우";
mockMvc.perform(post(SettingsController.SETTINGS_PROFILE_URL)
.param("bio",bio)
.with(csrf()))
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl(SettingsController.SETTINGS_PROFILE_URL))
.andExpect(flash().attributeExists("message"));
Account devjun = accountRepository.findByNickname("devjun");
assertEquals(bio, devjun.getBio());
}
커스텀 애노테이션 생성
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithAccountSecurityContextFacotry.class)
public @interface WithAccount {
String value();
}
SecurityContextFactory 구현
public class WithAccountSecurityContextFacotry implements WithSecurityContextFactory<WithAccount> {
// 빈을 주입 받을 수 있다.
// Authentication 만들고 SecurityuContext에 넣어주기
UserDetails principal = accountService.loadUserByUsername(nickname);
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, principal.getPassword(), principal.getAuthorities());
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);
}
실습
- 시작 커밋: https://github.com/devjun63/whiteship-studyolle/commit/acae83214649ff840d6e1f6d9cff2191d31a2e7b
- 완료 커밋: https://github.com/devjun63/whiteship-studyolle/commit/81e1b2df7423c4c57735b6e60ea9ac4b4f472346
'BackEnd > Spring & Springboot Study' 카테고리의 다른 글
[토비의 스프링] 토비의 스프링 - 스프링을 효과적으로 익히기 위한 세 가지 (0) | 2022.11.22 |
---|---|
[토비의 스프링] 토비의 스프링 시작하기 (0) | 2022.11.22 |
예제로 배우는 스프링 프레임워크 입문 - 스프링 PSA (0) | 2021.12.08 |
예제로 배우는 스프링 프레임워크 입문 - 스프링@AOP 실습 (0) | 2021.12.05 |
예제로 배우는 스프링 프레임워크 입문 - 프록시 패턴 (0) | 2021.12.03 |