kotlin - kotest - mockK - kotlin DSL - BDD 테스트를 작성해보자

IKNOW·2023년 11월 4일
0
class SignUpApiTest : BehaviorSpec() {
    override fun isolationMode(): IsolationMode = IsolationMode.InstancePerTest

    init {
        val accountRepository = mockk<AccountRepository>()
        val mockMvc = MockMvcBuilders.standaloneSetup(AccountController(AccountServiceImpl(accountRepository))).build()

        val email = "test@gmail.com"
        val password = "password"
        val signForm = SignForm(email, password)
        val requestBody = jacksonObjectMapper().writeValueAsString(signForm)

        Given("특정 이메일로 생성된 계정이 이미 존재하는 경우") {

            every { accountRepository.existsByEmail(any()) } returns true

            When("사용자가 해당 이메일로 회원 가입을 시도한다면") {

                val result = mockMvc.post("/account/sign-up") {
                    content = requestBody
                    contentType = MediaType.APPLICATION_JSON
                    accept = MediaType.APPLICATION_JSON
                }

                Then("409에러로 응답한다.") {
                    result.andExpect {
                        status { isConflict() }
                    }
                }
            }
        }
        Given("특정 이메일로 생성된 계정이 존재하지 않는 경우") {

            every { accountRepository.existsByEmail(any()) } returns false
            every { accountRepository.save(any()) } returns Account(email, password)

            When("사용자가 해당 이메일로 회원가입을 시도한다면") {

                val result = mockMvc.post("/account/sign-up") {
                    content = requestBody
                    contentType = MediaType.APPLICATION_JSON
                    accept = MediaType.APPLICATION_JSON
                }
                Then("회원 정보를 db에 저장하고") {
                    //TODO: 나중에 H2DB를 이용한 저장 테스트 구현
                }
                Then("상태코드는 200 ok로 응답한다") {
                    result.andExpect {
                        status { isOk() }
                    }
                }
                Then("body는 'status':'success'로 응답한다") {
                    result.andExpect {
                        jsonPath("$.status") { value("success" )}
                    }
                }
            }
        }
    }
}

우선

Given(...){
  테스트 조건
  When(...) {
    테스트 동작
    Then(...) {
      테스트 결과 검증
    }
  }
}

구조로 변경시켰다.
이로써 더 사용자 시나리오에 맞는 BDD 테스트를 작성 할 수 있게되었다.

다음으로는 요청 부분과 검증을 kotlin dsl과 jsonPath를 사용하는 방식으로 변경하였다.

val result = mockMvc.post(uri) {
    content = requestBody
    contentType = MediaType.APPLICATION_JSON
    accept = MediaType.APPLICATION_JSON
}

result.andExpect {
    jsonPath("$.status") { value("success" )
}

이로써 조금더 편하게 json변환하였고 유연하게 When, Then절을 구성할 수 있게 되었다.

profile
조금씩,하지만,자주

0개의 댓글

관련 채용 정보