Java/Spring

[Spring] Test 코드에서 session 전달하기

씬프 2021. 7. 12. 11:08
반응형

스프링 웹 프로젝트에서 세션 기반의 로그인을 구현하고,

로그인한 회원에게만 질문 등록과 같은 특정한 기능을 제공하도록 로직을 구현했다.

 

세션은 HttpSession 객체를 파라미터로 전달하는데

테스트 상황에서는 적용되지 않았다.

 

테스트 코드에서 세션 사용

 

테스트 코드에서 Session을 사용하는 방식은 MockHttpSession을 통해 세션을 사용한다.

MockHttpSession session = new MockHttpSession();

 

사용방식은 기존의 세션과 동일하게 setAttribute(), getAttribute()와 같은 메서드를 활용할 수 있다.

 

이제, 생성된 세션에서 유저정보를 불어오는 것은 getAttribute 메서드를 통해 가져올 수 있다.

 

그렇다면, Controller에서 세션 인증이 필요한 로직이 추가된다면 테스트 코드에서는 어떻게 테스트 할 수 있을까?

 

테스트 코드에서 세션을 사용해 컨트롤러 테스트

 

먼저, 컨트롤러 테스트를 위해 MockMvc 객체를 선언한다.

private MockMvc mockMvc;

 

세션을 사용하지 않고 컨트롤러를 테스트할 땐, perform() 와 andExpect(), andDo()를 통해 테스트했다.

        mockMvc.perform(MockMvcRequestBuilders.get("/"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());

perform 메서드에 어떤 HTTP 메서드로 어떤 URI에 접근할 지,

andExpect에 어떤 결과 값을 기대할 지

andDo에 기대된 결과 값이 나왔을 때 어떻게 할 지 설정한다.

 

세션 인증을 통한 컨트롤러를 위와 같은 코드로 진행한다면, 로직에 따라 세션을 생성했어도 없는 것과 같이 진행될 것이다. 세션을 전달하기 위해서는 URI에 접근하는 메서드에 session 메서드를 추가해 세션을 전달할 수 있다.

 

        mockMvc.perform(MockMvcRequestBuilders.get("/").session(session))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());

위와 같은 테스트 코드를 작성하면 세션을 전달하면서 컨트롤러 테스트를 할 수 있다.