세션에서 넘어오는 데이터 바인딩
강의 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
@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 = []
7:58 예제 코드 찾는 법
0
255
2
PATCH의 Idempotent에 대한 질문
0
257
1
2:51초 질문입니다.
0
324
1
만약 어플리케이션컨텍스트에 필터를 설정하지 않으면 어떻게되나요?
0
361
0
web.xml에 위치한 애플리케이션 web.xml 내에서 파싱 오류 발생
0
514
0
Spring Boot 2.6 이상 버전에서의 DispatcherServlet
0
366
1
Event`Xxx`Controller 분리할때의 기준에 관한 질문입니다.
0
634
1
11분 57초 쯤, `returnValueHandlers` 들의 네이밍컨벤션 관련 질문입니다.
0
379
1
@EnableWebmvc 설정을 하면
0
415
1
springframework와의 차이점
0
283
1
@RequestBody의 바인딩에러를 잡는 방법
1
1655
2
안녕하세요 기선님 강의를 보다 서블릿에 궁금증이 생겨 질문 드립니다
1
236
1
HelloService의 값을 전달을 못 받습니다.
0
295
1
ServletContext와 WebApplicationContext의 관계 질문
1
740
1
하나의 서비스에, 두개의 리포지토리도 연결이 되나요?
0
363
1
view name 리턴에 대해
0
290
2
Formatter print 질문 드립니다.
0
232
1
에리 메시지가 한글입니다.
0
293
1
java 클래스파일로 설정되어 있던 것을 web.xml로 바꾸는 경우
0
337
1
@RequestParam
0
255
1
@Retention 질문
0
228
1
Event.builder() 관련 mac에서 lombok 문제 있으신 분들
0
197
1
스프링 부트 사용시 WebMvcConfigurerSupport 클래스
0
251
1
http://localhost:8080/hello 입력시 오류
0
488
4

