Controller 레이어의 단위 테스트를 작성해보자(1) (with Mockito)

NNIJGNUS·2024년 9월 12일

Unit Test

목록 보기
4/5

이전 게시글에서는 서비스 레이어에서 단위테스트 작성법과 테스트 커버리지를 측정하고,
다양한 상황에서의 트러블 슈팅에 대해서 알아봤다.

이번 게시글에서는 컨트롤러 레이어에서 단위 테스트 작성법을 알아보도록 하자.

단위 테스트 상세와 목표

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;

MockMvcSpring 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 인지 확인한다.

테스트 커버리지 측정

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

0개의 댓글