ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Project] Controller Test Code - MockHttpSession
    Project 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

    'Project' 카테고리의 다른 글

    [Project] NCP centOS7 nginx설치  (0) 2024.07.02
    [Project] "Executing an update/delete query" 오류  (0) 2024.07.01
    [Project] Image전송  (0) 2024.06.17
    [Project] CentOS7 JDK17 설치  (1) 2024.06.08
    [Project] Naver cloud platform 서버 생성  (0) 2024.06.08

    댓글

© 2022. code-space ALL RIGHTS RESERVED.