@PostMapping("/todos")
public ResponseEntity<TodoSaveResponse> saveTodo(
@Auth AuthUser authUser,
@Valid @RequestBody TodoSaveRequest todoSaveRequest
) {
return ResponseEntity.ok(todoService.saveTodo(authUser, todoSaveRequest));
}
할 일을 등록하는 위 코드를 테스트 코드로 작성하려 한다.
우선 기본 세팅으로
@WebMvcTest(TodoController.class)
class TodoControllerTest {
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private TodoService todoService;
@Autowired
private TodoController todoController;
@BeforeEach
public void setUp() {
this.mockMvc = MockMvcBuilders.standaloneSetup(todoController).build();
}
MockMvc 를 사용하기 위해서
@WebMvcTest(TodoController.class)
를 클래스 위에 붙여주고
private MockMvc mockMvc;
객체 선언한다.
@Autowired
private ObjectMapper objectMapper;
또, 데이터를 주고 받을 때 JSON 타입으로 변환해서 받기 위해서 ObjectMapper 선언
@MockBean
private TodoService todoService;
TodoService 를 실제로 사용하지는 않지만 안에 있는 메서드를 불러오기 위해서 TodoService 를 Mock 객체로 불러온다.
TodoSaveRequest todoSaveRequest = TodoMockDataUtil.todoSaveRequest();
TodoSaveResponse todoSaveResponse = TodoMockDataUtil.todoSaveResponse();
public class TodoMockDataUtil {
public static TodoSaveRequest todoSaveRequest() {
return new TodoSaveRequest("title", "contents");
}
public static TodoSaveResponse todoSaveResponse() {
return new TodoSaveResponse(1L, "title", "contents", "weather", UserMockDataUtil.userResponse());
}
public class UserMockDataUtil {
public final static UserResponse userResponse() {
return new UserResponse(1L, "email");
}
우선 할 일을 등록할 때 입력하는 title 과 contents 를 todoSaveRequest 에 담아 저장하기 때문에 이를 Dummy Data 를 만들어주어야한다.
마찬가지로 Todoservice.saveTodo 메서드를 실행할 시에 반환되는 값인 TodoSaveResponse 역시 Dummy Data 로 만들어준다.
return ResponseEntity.ok(todoService.saveTodo(authUser, todoSaveRequest));
기존 테스트 코드에서 위 코드와 같이 return 값을 받는데, 결국 어떤 authUser 가 들어가든 todoSaveRequest 가 들어가든 의미 없이 만들어놓은 todoSaveResponse 가 나와야한다.
given(todoService.saveTodo(any(), any())).willReturn(todoSaveResponse);
그래서 위와 같이 given 을 설정해주었다.
// when-then
mockMvc.perform(post("/todos")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(todoSaveRequest)))
.andExpect(status().isOk());
그런 다음 응답값이 200인지 확인해주는 위 코드를 만들어주었다.
입력값이 @RequestBody 가 아니라 @RequestParam 이면
.param("page", "1")
.param("size", "10"))
위처럼 코드를 추가해주었고, 만약에 @PathVariable 로 데이터를 받는다면
mockMvc.perform(get("/todos/{todoId}", todoId)
이렇게 콤마(,) 를 이용해서 데이터를 받을 수 있다.
전체 코드
@Test
public void todo_등록_성공() throws Exception {
// given
TodoSaveRequest todoSaveRequest = TodoMockDataUtil.todoSaveRequest();
TodoSaveResponse todoSaveResponse = TodoMockDataUtil.todoSaveResponse();
given(todoService.saveTodo(any(), any())).willReturn(todoSaveResponse);
// when-then
mockMvc.perform(post("/todos")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(todoSaveRequest)))
.andExpect(status().isOk());
}
'컴퓨터 프로그래밍 > Spring' 카테고리의 다른 글
[Spring] RestTemplate (2) | 2024.09.17 |
---|---|
[Spring] Service Test Code 작성 (0) | 2024.09.14 |
[Spring] AOP (0) | 2024.09.10 |
[Spring] 통합 테스트 (1) | 2024.09.10 |
[Spring] Mockito (0) | 2024.09.09 |