[MockMvc - SpringTest] Spring Security Login Test
Spring Boot Security를 이용하여 로그인 테스트를 실행 방법을 알아보자.
기본 세팅 - gradle
testImplementation 'org.springframework.security:spring-security-test'
Test를 하기 위해서는 security-test 라이브러리를 추가해줘야 한다. 기본적으로 Mockmvc 가상 웹 환경에서 진행하는데 해당 과정의 동작 처리에 필요하다(CSRF 토큰, 인증, 인가등등..)
테스트 코드 작성 방법
@Slf4j
@SpringBootTest
@TestPropertySource(locations = "classpath:application-api.properties")
@ActiveProfiles("test")
@Transactional
@AutoConfigureMockMvc
class MembersServiceTest extends BaseTest {
@Autowired
private MockMvc mockMvc;
@BeforeEach
@DisplayName("테스트용 아이디 생성")
void ApprovedID() {
Members members = Members.builder()
.memberId("UserId")
.memberPassword(encoder.encode("UserPw"))
.role(Role.USER)
.build();
membersRepository.save(members);
log.info("테스트용 아이디 생성 완료");
}
@Test
@DisplayName("아이디 생성")
void createId() throws Exception {
mockMvc.perform(post("/signup")
.param("memberId", "createId")
.param("memberPassword", "createPw")
.with(csrf()))
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/login"));
}
@Test
@DisplayName("로그인 성공")
void loginSuccess() throws Exception {
mockMvc.perform(post("/login")
.param("memberId", "UserId")
.param("memberPassword", "UserPw")
.with(csrf()))
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/loginSuccess"));
}
}
- SSR 프로젝트 기반이여 thymeleaf 문법 사용시 post 요청에 자동으로 csrf() 를 포함해 전송했지만 가상 웹 환경의 mockMvc에서는 자동 포함이 되지 않기 때문에 별도 추가를 해주면 된다.
- param에 들어가는 변수 이름은 사용자 설정에 따라 다르며 SecurityConfig 설정에서 각각의 규칙에 따라 이름이 정해진 것을 사용하면 된다. default 값은 Username과 Password이다.
- 로그인 성공 혹은 아이디 생성 시 작성한 별도의 CustomHandler 혹은 Controllor에서의 반환 경로를 입력해주면 된다.
추가
기본적으로 Spring Security는 CSRF 보호를 하게 되는데 이는 클라이언트에서 CSRF 토큰을 추가하지 않으면 302에러를 발생 시키며 redirect 시킨다.
MockMvc를 이용하면 SpringSecurity 별 URL 접속 권한에 관련 요청 수행을 테스트하기 유용하다. MockHttpSession을 이용해 로그인 성공처리를 한 후 특정 페이지에 접속하는 테스트도 수행할 수 있다.
스프링 테스트 진행시 의존성 문제 해결 방법
https://zks145.tistory.com/133?category=1097290
[트러블 슈팅 - Spring Test] 의존성 주입 실패 (test yml 파일 안 읽힘)
문제 사항 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'messageController' defined in file [~~~\controller\MessageController.class]: Unsatisfied dependency expressed through constructor parameter 0: E
zks145.tistory.com