Project
[Project] Controller Test Code - MockHttpSession
owls
2024. 6. 21. 14:45
728x90
@WebMvcTest 어노테이션을 사용해서 컨트롤러 테스트를 할 수 있다.
세션 기반으로 사용자 인증을 구현하였기에 세션 인증 테스트를 어떻게 해야 하는지 알아보았다.
2가지 방법이 있다.
1. Map<String, Object> 로 세션 속성 저장하기
2. MockHttpSession 사용하기
1. Map<string, object>
@ExtendWith(SpringExtension.class)
@WebMvcTest(CartApiController.class)
public class CartApiControllerTest {
@Autowired
private MockMvc mockMvc;
private Map<String, Object> sessionAttributes;
@BeforeEach
void setUp(){
sessionAttributes = new HashMap<>();
sessionAttributes.put("MemberId", 999L);
MemberDto memberDto = MemberDto.builder()
.id(999L)
.email("test@naver.com")
.password("asdf7890*")
.build();
sessionAttributes.put("MemberDto", memberDto);
}
...
@DisplayName("장바구니 추가 성공 테스트")
@Test
public void saveCart() throws Exception{
doNothing().when(cartService).save(any(), any());
String content = objectMapper.writeValueAsString(cartRequestDto);
mockMvc.perform(post("/api/cart")
.sessionAttrs(sessionAttributes)
.content(content)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print());
}
}
직접 Map을 만들어 세션을 만든다면 sessionAttrs()메서드에 파라미터를 넘겨주면 된다.
2. MockHttpSession 사용하기
@ExtendWith(SpringExtension.class)
@WebMvcTest(CartApiController.class)
public class CartApiControllerTest {
@Autowired
private MockMvc mockMvc;
private MockHttpSession mockHttpSession;
@BeforeEach
void setUp(){
MemberDto memberDto = MemberDto.builder()
.id(999L)
.email("test@naver.com")
.password("asdf7890*")
.build();
mockHttpSession = new MockHttpSession();
mockHttpSession.setAttribute("MemberId", 999L);
mockHttpSession.setAttribute("MemberDto", memberDto);
}
...
@DisplayName("장바구니 추가 성공 테스트")
@Test
public void saveCart() throws Exception{
doNothing().when(cartService).save(any(), any());
String content = objectMapper.writeValueAsString(cartRequestDto);
mockMvc.perform(post("/api/cart")
.session(mockHttpSession)
.content(content)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print());
}
}
mockHttpSession을 사용하면 기존에 세션을 저장했던 것 처럼 setAttribute()메서드로 저장하고,
mockMvc의 session메소드 파라미터로 넘겨주면 된다.
728x90