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