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절을 구성할 수 있게 되었다.