해결된 질문
작성
·
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
감사합니다. 답변과 이어지는 강의를 참고해 다음과 같이 수정해 테스트 코드를 작성했습니다.
혹시나 해서, 코드 남겨놓도록 하겠습니다.
<컨트롤러>
@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 = []