class AccountServiceImpl(
private val accountRepository: AccountRepository
):AccountService {
override fun signUp(signForm: SignForm): ResponseEntity<Map<String, String>> {
if(accountRepository.existsByEmail(signForm.email)) {
return ResponseEntity.status(409)
.build()
}
val account:Account = accountRepository.save(Account(signForm.email, signForm.password))
return ResponseEntity.ok()
.body(mapOf("status" to "success"))
}
class SignForm(val email:String, val password:String)
@Entity
class Account(val email:String, val password:String) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null
}
위와 같이 작성된 회원가입 함수에 대해 테스트를 작성하고자 한다.
/**
* [회원 가입 테스트]
* 1. 회원가입이 정상적으로 동작한다.
* 2. 중복되는 email로는 가입할 수 없다.
*/
class SignUpTest : BehaviorSpec({
lateinit var accountRepository: AccountRepository
lateinit var accountController: AccountController
given("유저가 회원가입을 요청을 할 때") {
accountRepository = mockk()
accountController = AccountController(AccountServiceImpl(accountRepository))
val email = "email@test.com"
val password = "some_secure_password"
val signForm: SignForm = SignForm(email, password)
`when`("이메일이 중복되지 않았다면") {
//email로 저장된 계정이 존재하는지 확인한다.
every { accountRepository.existsByEmail(email) } returns false
//SignForm으로 생성한 Account Entity를 DB에 저장한다.
every { accountRepository.save(any()) } returns Account(email, password)
then("회원 정보를 db에 저장하고 200ok이고 'status'값이 'success' response를 반환한다.") {
val response = accountController.signUp(signForm)
//response의 status값을 확인한다.
response.body?.get("status") shouldBe "success"
}
}
`when`("중복된 이메일이 존재한다면") {
every { accountRepository.existsByEmail(email) } returns true
then("209 conflict를 반환한다..") {
val response = accountController.signUp(signForm)
response.statusCode.value() shouldBe HttpStatus.CONFLICT.value()
}
}
}
})
테스트가 정상적으로 통과되는 것을 확인 할 수 있다.