문제점
- 컨트롤러를 @WebMvcTest로 진행하여 필요한 빈들만 등록한 후
- 나머지 연관관계가 있는 빈들은 Mock 가짜로 등록해주기로 하였다.
@WebMvcTest(controllers = {
AuthController.class
})
public abstract class ControllerTestSupport {
@Autowired
protected MockMvc mockMvc;
@Autowired
protected ObjectMapper objectMapper;
@MockBean
protected AuthService authService;
}
- Controller 테스트에 필요한 빈들을 추상 클래스로 분리하여 지정해두었다.
class AuthControllerTest extends ControllerTestSupport {
@DisplayName("필요한 정보들을 입력하면 회원가입을 할 수 있다.")
@Test
void signUp() throws Exception {
// given
SignUpRequestDto request = createSignUpRequest("test22@naver.com", "testpassword33"
,"testNickname34", "01022222222");
// when & then
mockMvc.perform(
post("/api/v1/auth/sign-up")
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON))
)
.andDo(print())
.andExpect(status().isOk());
}
}
- 상속하여 위의 설정들을 가지고 테스트 코드를 작성할 수 있게 되었다.!
- 신나게 통과할 걸 예상하고 돌렸다.
- 403 (Forbidden) 이 발생하였다.! -> 인가에서 터진건데?...
- 근데 터져도 인증에서 터져야 하는거 아닌가
- 인증(401) -> 인가(403)
열심히 찾아보았다.
해결
오! SecurityConfig 파일을 안 읽어와서 설정이 안 먹히는 거였다.
- 403 -> csrf때문
@AutoConfigureMockMvc(addFilters = false)
@WebMvcTest(controllers = {
AuthController.class
})
public abstract class ControllerTestSupport {
@Autowired
protected MockMvc mockMvc;
@Autowired
protected ObjectMapper objectMapper;
@MockBean
protected AuthService authService;
}
@DisplayName("필요한 정보들을 입력하면 회원가입을 할 수 있다.")
@Test
void signUp() throws Exception {
// given
SignUpRequestDto request = createSignUpRequest("test22@naver.com", "testpassword33"
,"testNickname34", "01022222222");
// when & then
mockMvc.perform(
post("/api/v1/auth/sign-up")
.content(objectMapper.writeValueAsString(request))
.contentType(MediaType.APPLICATION_JSON)
.with(csrf())
)
.andDo(print())
.andExpect(status().isOk());
}
- AutoConfigureMockMvc(addFilters = false)
- with(csrf()) 추가해주었다.
AutoConfigureMockMvc(addFilters = false)은 뭘까?
- 지금 테스트 해보려는 것은 Spring Security Filter가 아니다.
- addFilters는 기본 보안 필터를 포함할지 여부를 제어하는 데 사용한다.
- false는 -> 내가 설정해준 SecurityFilter를 사용하지 않겠다는 뜻으로
- 무조건 Controller에게 요청이 가게된다.
나는 회원인증 인가도 테스트해보고 싶은데?
- 이 부분 생각도 해봤는데, 테스트 논점을 벗어난거 같아서...
- Filter 관련해서 테스트 코드를 작성을 따로 해야하는건가. 아닌건가 싶어서. 일단은
- 위의 두가지 설정을 가지고 테스트 코드를 작성하려고 한다.