RestController를 테스트 하고자 @WebMvcTest 어노테이션을 사용하여 테스트를 진행하고자 하였다.
(@WebMvcTest는 @SpringBootTest 보다 ComponentScan 하는 범위가 좁아 더 가볍다고 한다)
그러나 로직에는 문제가 없어 보였는데 지속적으로 HTTP Status code 중 403(Forbidden) 오류가 지속적으로 떴다.
Spring Security 프로젝트를 의존성 추가를 하여 사용하고 있음을 깨닫고 csrf 필터를 확인해보았지만 disable() 해놓았기 때문에
문제가 될 것이 없을 것이라 생각했다.
그리하여 열심히 구글링 중 "뷰티플 프로그래밍" 이라는 블로그(아래 링크 참고)에서 해당 문제를 동일하게 겪고 난 후의 해결 방법을 공유해주셨다.
- mockMvc.perform() 구문에 with(csrf()) 추가하기
- csrf()만 추가할 경우 401(Unauthorized) 에러가 발생한다. 고로 아래 2번까지 적용시켜줘야함.
- 테스트할 메서드의 @Test 어노테이션 밑에 @WithMockUser 추가하기
@Test
@WithMockUser //추가
void createMember() throws Exception {
String username = "test";
String email = "123@123.com";
String pwd = "1234";
int id = 1;
MemberRegisterDto registerDto = new MemberRegisterDto(username, email, 1, "Y");
String valueAsString = new ObjectMapper().writeValueAsString(registerDto);
Project project = new Project("test Project", ProjectStatus.ACTIVE);
project.setId(id);
MemberInfo memberInfo = new MemberInfo(username, email, pwd);
memberInfo.setId(id);
Member member = new Member(project, memberInfo, Member.IS_ADMIN);
when(projectService.getProject(id)).thenReturn(project);
when(memberService.getMemberInfo(username)).thenReturn(memberInfo);
when(memberService.insertMember(any())).thenReturn(member);
mockMvc.perform(post("/members")
.with(csrf()) //추가
.contentType(MediaType.APPLICATION_JSON)
.content(valueAsString))
.andDo(print())
.andExpect(status().isCreated())
.andExpect(header().string("Location", "/members/" + id));
}
원인에 대해서는 더 공부해보겠지만 추측으로는 @WebMvcTest는 Component scan 범위가 좁아서 securityConfig에 내가 따로 정의해놓은 security filter에 대한 셋팅이 적용되지않고 default로 적용된 듯하다.
* 참고
반응형
'에러 혼내주기 > Spring' 카테고리의 다른 글
[Spring] @ResponseBody사용시 DTO에서 is라는 글자가 사라지는 에러 해결 방법 (0) | 2023.01.06 |
---|---|
[Spring] JPA entity 설정시 SQL Error: 1064, SQLState: 42000 에러 (0) | 2023.01.05 |