최근에 여름방학 스타트업 인턴 과제테스트를 본적이 있다. 요구 사항에 맞은 API 설계 및 구현이 해당 과제의 목적이었고, 추가로 요구 사항들이 만족하는 것을 검증할 수 있는 Test Code를 작성해야 했다. 하지만 MockMvc에 대해 잘 알지 못했기 때문에, Postman으로 테스트한 결과를 캡처해서 제출하였다. MockMvc에 대해서 알았더라면 더 좋았을 텐데라는 생각을 들어, 기록하기로 했다.
웹 애플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC 환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String userId;
private String password;
}
@RestController
public class Controller {
@GetMapping("/home")
public String getHome() {
return "request home";
}
@PostMapping("/home")
public UserDto postHome(@RequestBody User user) {
return new UserDto(user.getUserId(), user.getPassword());
}
@Data
@AllArgsConstructor
static class UserDto {
private String id;
private String pwd;
}
}
@WebMvcTest
class ControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void getHome() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/home"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("request home"))
.andDo(MockMvcResultHandlers.print());
}
@Test
public void postHome() throws Exception {
String requestJson = "{\"userId\":\"minnseong\", \"password\": \"1234\"}";
String responseJson = "{\"id\":\"minnseong\",\"pwd\":\"1234\"}";
mockMvc.perform(MockMvcRequestBuilders.post("/home")
.contentType(MediaType.APPLICATION_JSON)
.content(requestJson))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string(responseJson))
.andDo(MockMvcResultHandlers.print());
}
}
MockMvcResultMatchers, MockMvcResultHandlers 등 static import 시켜 코드를 간결하게 할 수 있다.
param/params, cookie, requestAttr, sessionAttr, content, header/headers, contentType ...
status, header, content, cookie, view, redirectedUrl, model, request, forwardedUrl ...
https://velog.io/@jkijki12/Spring-MockMvc
https://www.inflearn.com/course/호돌맨-요절복통-개발쇼/lecture/111150?volume=1.00
정말 감사합니다.. 살았어요..