인프런 커뮤니티 질문&답변

jaden님의 프로필 이미지
jaden

작성한 질문수

스프링 웹 MVC

핸들러 메소드 5부 @ModelAttribute

세션에서 넘어오는 데이터 바인딩

해결된 질문

작성

·

352

0

강의 3분 정도의 설명에 session 에 있는 데이터를 받아와 @ModelAttribute 의 객체에 바인딩이 가능하다고 하셔서, 테스트를 작성해봤지만 실패해 테스트를 어떻게 작성해야하는지 질문드립니다.. 제가 시도한 방법은 다음과 같습니다. 

<컨트롤러>

@Controller
public class TestController {

    @PostMapping("/session")
    @ResponseBody
    public Event sessionTest(@ModelAttribute Event event){
        return event;
    }

}

<테스트 코드 >

@WebMvcTest
class TestControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    void sessionTest() throws Exception {

        MockHttpSession session = new MockHttpSession();
        session.setAttribute("name", "jaden");


        mockMvc.perform(post("/session")
        .session(session)
        .param("limit", "10"))
                .andDo(print())
                .andExpect(status().isOk());
    }

}

<실행결과>

세션을 목업해서 넘겨봤는데, 바인딩이 되지 않아 null 이 찍힙니다.  

또한, 

두번째로 시도한 방법은 mockMvc 에 .sessionAttr 을 넣을 수 있어서 사용해 봤습니다.

<테스트코드>

@Test
    void test2() throws Exception{
        mockMvc.perform(post("/session")
        .sessionAttr("limit", "10")
        .param("name", "jaden"))
                .andDo(print())
                .andExpect(status().isOk());
    }

<실행결과>

하지만 마찬가지로 바인딩이 잘 되지 않는 것 같더라구요.. 

어떻게 테스트 코드를 작성해야 제대로 바인딩을 할 수 있을까요? 

--- 

아니면 혹시, session 에서 값을 받아와 setter 를 통해 직접 바인딩 해줄 수 있기 때문에 그렇게 말씀하신걸까요? 

좋은 강의 감사드립니다! 

답변 3

1

백기선님의 프로필 이미지
백기선
지식공유자

귿! 잘 하셨어요.

1

백기선님의 프로필 이미지
백기선
지식공유자

@SessionAttributes랑 같이 사용해야 하는데 뒤에 이어지는 수업에서 다룰테니 여기서는 이 애노테이션만 언급하겠습니다. 테스트 코드는 그좋아보여요. 이렇게 테스트 하시면서 학습하시면 실력이 많이 늘꺼에요.

0

jaden님의 프로필 이미지
jaden
질문자

감사합니다. 답변과 이어지는 강의를 참고해 다음과 같이 수정해 테스트 코드를 작성했습니다. 

혹시나 해서, 코드 남겨놓도록 하겠습니다.

<컨트롤러>

@Controller
@SessionAttributes("event")
public class TestController {

    @PostMapping("/session/input")
    @ResponseBody
    public Event sessionInput(Model model){
        Event event = new Event();
        event.setName("jaden");
        model.addAttribute("event", event);
        return event;
    }

    @PostMapping("/session")
    @ResponseBody
    public Event sessionTest(@ModelAttribute Event event){
        return event;
    }
}

<테스트코드>

@WebMvcTest
class TestControllerTest {

   @Autowired
    MockMvc mockMvc;

   @Test
    void sessionTest() throws Exception {
       MockHttpServletRequest request = mockMvc.perform(post("/session/input"))
               .andExpect(status().isOk())
               .andReturn().getRequest();
       assertThat(request.getSession().getAttribute("event")).isNotNull();

       mockMvc.perform(post("/session")
        .session((MockHttpSession) request.getSession())
        .param("limit", "10"))
               .andDo(print());
   }
}

<실행결과> 

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json", Cache-Control:"no-store"]
     Content type = application/json
             Body = {"id":null,"name":"jaden","limit":10}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
jaden님의 프로필 이미지
jaden

작성한 질문수

질문하기