Java/Spring

[Spring] MockMvc 테스트에서 Model 전달

씬프 2021. 7. 13. 13:56
반응형

질문 상세 페이지를 테스트할 때,

컨트롤러에서는 질문의 내용을 모델에 담아 전달해 템플릿 엔진을 통해 출력했다.

 

테스트 코드에서 모델에 담아 전달할 방법이 어떻게 되는지 찾아봤는데,

Model을 선언하고 넘길 수 있는 코드는 보이지 않았다.

 

생성된 객체를 전달하기

질문을 생성하고 질문의 상세 페이지를 접근하는 테스트코드를 작성할 때,

먼저, get을 통해 URI를 설정하고 접근할 것이다.

이 때, 생성된 질문을 전달해주기 위해서 flashAttr() 메서드를 사용한다.

 

flashAttr() 메서드에 객체 이름과 생성된 객체를 전달해준다.

mockMvc.perform(MockMvcRequestBuilders
                    .get(String.format("/questions/%d", newQuestion.getId()))
                    .flashAttr("newQuestion", newQuestion)
                    .session(session))

 

andExpect 작성하기

먼저 위 코드의 테스트의 결과 status를 확인한다.

그리고, 모델에 컨트롤러에서 작성한 것과 동일한 이름의 속성이 있는지 확인한다.

그리고 적절한 뷰로 전달되었는지 확인한다.

                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.model().attributeExists("question"))
                .andExpect(MockMvcResultMatchers.view().name("qna/detail"))

 

 

정리하기

테스트 코드에서 model.addAttribute() 와 같은 메서드를 사용하진 않았다.

생성된 객체를 perform 메서드 안에서 flashAttr() 메서드를 통해 전달했다.

 

그리고 이에 대해 상태코드, 모델 확인, 뷰 확인을 통해 적절한지 확인했다.

 

 

앞으로 컨트롤러에 대한 테스트 코드를 작성할 때,

 

1. perform() 메서드 작성

2. andExpect() 에는 상태코드, 모델, 뷰에 대한 테스트 코드를 작성한다.