본문 바로가기
컴퓨터 프로그래밍/Spring

[Spring] Controller Test Code 작성

by 한33 2024. 9. 14.

@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