스프링 웹 프로젝트에서 세션 기반의 로그인을 구현하고,
로그인한 회원에게만 질문 등록과 같은 특정한 기능을 제공하도록 로직을 구현했다.
세션은 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());
위와 같은 테스트 코드를 작성하면 세션을 전달하면서 컨트롤러 테스트를 할 수 있다.
'Java > Spring' 카테고리의 다른 글
[Spring] MockMvc 테스트에서 Model 전달 (0) | 2021.07.13 |
---|---|
[Java Spring] HTTP PUT, DELETE 사용 (0) | 2021.06.25 |
[Java Spring] Controller 구현 후 404 Error (0) | 2021.06.21 |
[Spring-boot] H2 데이터베이스 연결하기 (0) | 2021.06.01 |
[Java Spring] 프로젝트 생성 후 테스트 코드 (0) | 2021.05.30 |