kotlin - kotest - mockk BehaviorSpec스타일로 테스트를 작성해보자

IKNOW·2023년 11월 2일
0

kotlin study

목록 보기
5/5
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()
            }
        }
    }

})


테스트가 정상적으로 통과되는 것을 확인 할 수 있다.

profile
조금씩,하지만,자주

0개의 댓글

관련 채용 정보