이전 게시글에서는 서비스 레이어에서 단위테스트 작성법과 테스트 커버리지를 측정하고,
다양한 상황에서의 트러블 슈팅에 대해서 알아봤다.
이번 게시글에서는 컨트롤러 레이어에서 단위 테스트 작성법을 알아보도록 하자.
HealthController 를 대상으로 단위 테스트를 진행하며, 엔드포인트가 /health 하나밖에 존재하지 않으므로 테스트 커버리지 100% 달성을 목적으로 한다.
@RestController
@RequestMapping("/health")
@ResponseBody
public class HealthController {
@GetMapping
public ResponseEntity<ResponseDto> health(){
return ResponseEntity
.status(HttpStatus.OK)
.body(new ResponseDto("Server OK"));
}
}
우선 단위 테스트를 작성할 HealthController를 먼저 살펴보자.
/health 엔드포인트에 요청을 전송한다면, 200 OK와 함께 Server OK 메시지를 응답하는 간단한 컨트롤러다.
이제 단위 테스트를 작성해보자.
@WebMvcTest(HealthController.class) // 1
class HealthControllerTest {
@Autowired
private MockMvc mockMvc; // 2
@Test
void health() throws Exception {
//when
ResultActions perform = mockMvc.perform(get("/health")); // 3
//then
perform.andExpect(status().isOk()) // 4
.andExpect(jsonPath("$.message").value("Server OK")) // 5
.andDo(print()); // 6
}
}
@WebMvcTest(HealthController.class)
@WebMvcTest 어노테이션을 통해 MVC 관련 컴포넌트만 로드하여 단위 테스트를 작성할 수 있다.
해당 코드에서는 HealthController 만을 로드한다.
private MockMvc mockMvc;
MockMvc는 Spring MVC 테스트를 위한 객체로, 실제 서버를 실행하지 않고도 HTTP 요청을 시뮬레이션할 수 있게 해준다.
이 객체를 사용하여 컨트롤러의 엔드포인트에 대한 요청을 보내고, 그에 대한 응답을 검증할 수 있다.
ResultActions perform = mockMvc.perform(get("/health"));
perform() 메서드는 지정된 HTTP 요청을 수행하는데 사용된다.
해당 코드에서는 /health 엔드포인트에 GET 요청을 전송하고, 그 결과를 ResultActions 객체에 저장한다.
perform.andExpect(status().isOk())
HTTP 응답의 상태 코드가 200 OK인지 확인하는 검증을 수행한다.
andExpect(jsonPath("$.message").value("Server OK"))
JSON 응답의 특정 필드 값을 확인한다.
해당 코드에서는 응답 JSON 객체의 message 필드가 Server OK 인지 확인한다.

목표했던 테스트 커버리지를 달성했다.