본문 바로가기
Jave & Kotlin

Kotlin - MockMvc를 이용하여 REST API 테스트하기 (feat. Json Response)

by devLog by Ronnie's 2022. 2. 19.

들어가며


Spring Boot에서 제공하는 @SpringBootTest 어노테이션을 이용하여 테스트를 진행할 수 있지만 해당 어노테이션으로 테스트를 진행할 시에 스프링이 관리하는 모든 빈을 등록시켜서 통합 테스트를 진행하기 때문에 상대적으로 무겁다. 그렇기 때문에 Rest API에 대한 테스트를 진행할때는 MockMvc를 이용하여 테스트를 많이 한다.

 

MockMvc 객체란?


MockMvc는 서블릿 컨테이너의 구동 없이 시뮬레이션된 MVC 환경에 모의 HTTP 서블릿 요청을 전송하는 기능을 제공하는 유틸 클래스이다. 그렇기 때문에 컨트롤러 테스트용으로 자주 사용된다.

 

 

Code


import org.junit.jupiter.api.Test
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
import org.springframework.test.context.TestConstructor
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status

@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
class CompanyControllerTest(
    val companyRepository: CompanyRepository
) : BaseMvcTest() {

    companion object {
        const val DEFAULT_API_URL = "/api/v1/company"
    }

    @Test
    fun `company save 테스트`() {
        // Given
        //val service = mutableListOf("SUPP", "AGEN")
        val code = "test_code"
        val name = "회사명1"
        val ceo = "대표자1"

        val request = ReqCompanySaveDTO(
            code = code,
            name = name,
            ceo = ceo
        )

        // When, Then
        mockMvc.perform(
            post(DEFAULT_API_URL)
                .contentType(MediaType.APPLICATION_JSON)
                .content(mapper.writeValueAsBytes(request))
        )
            .andExpect(status().isOk)
            .andExpect(jsonPath("$.code").value(HttpStatus.CREATED.value()))
            .andExpect(jsonPath("$.message").value(HttpStatus.CREATED.reasonPhrase))
    }

 

 

MockMvc가 제공하는 메서드


perform()


해당 메서드를 통해 브라우저에서 서버로 URL로 요청하듯 컨트롤러를 실행 테스트가 가능하다. perform() 메서드는 RequestBuilder 객체를 인자로 받고 MockMvcRequestBuilders의 정적 메서드를 이용해서 생성

 

MockMvcRequestBuilders


MockMvcRequestBuilders의 메서드들은 GET / POST / PUT / DELETE 요청 방식과 매핑되는 get() / post() / put() / delete() 메서드들 제공한다. 해당 메서드들은 MockHttpServletRequestBuilder 객체를 리턴함. 

더불어 HTTP 요청 관련 정보 (파라미터, 헤더, 쿠키 등)를 설정할 수 있고, MockHttpServletRequestBuilder의 메서드들을 통해 MockHttpServletRequestBuilder 객체를 다시 리턴하여 메시지 체인을 구성하여 다양한 요청을 설정 가능하다.

        mockMvc.perform(
            post(DEFAULT_API_URL)
                .contentType(MediaType.APPLICATION_JSON)
                .content(mapper.writeValueAsBytes(request))
        )

 

andExpext()

 

perform() 메서드를 이용하여 요청을 전송하면 그 결과로 ResultActions 객체를 리턴한다. 이때 이 객체는 응답 결과를 검증할 수 있는 andExpect() 메서드를 제공한다. andExpect()가 요구하는 ResultMatcher는 MockMvcResultMatchers에 정의된 정적 메서드를 통해 성성할 수 있다. 

 

 

+ JsonPath란?

 

Json 객체를 탐색하기 위한 표준화된 방법이며 대표 표현법으로는 Dot 표현법과 Bracket 표현법 두가지가 있다.

아래에 링크를 통해 대표 연산자 및 메서드들을 확인할 수 있다.

https://github.com/json-path/JsonPath

 

GitHub - json-path/JsonPath: Java JsonPath implementation

Java JsonPath implementation. Contribute to json-path/JsonPath development by creating an account on GitHub.

github.com

 

댓글