Kotest
는 Kotlin 기반의 테스트 프레임워크로, 직관적인 DSL과 다양한 스타일(BDD, StringSpec, ShouldSpec 등)을 지원합니다.
Mockk
는 Kotlin 전용 모킹 라이브러리로, Java의 Mockito
보다 더 Kotlin 친화적인 문법을 제공합니다.
BDD 스타일은 테스트의 가독성을 높이고, 비개발자도 쉽게 이해할 수 있도록 돕습니다. Kotest의 BehaviorSpec
을 활용하면 자연스러운 BDD 테스트를 작성할 수 있습니다.
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe
class SampleTest : BehaviorSpec({
given("두 개의 숫자가 주어졌을 때") {
val a = 3
val b = 5
`when`("이 두 수를 더하면") {
val result = a + b
then("올바른 결과가 나와야 한다") {
result shouldBe 8
}
}
}
})
서비스 계층을 테스트할 때, 의존성을 모킹하면 테스트의 독립성을 유지할 수 있습니다.
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
class MockkExampleTest : BehaviorSpec({
given("Mockk를 활용한 서비스 테스트") {
val repository = mockk<UserRepository>()
val service = UserService(repository)
`when`("사용자를 조회하면") {
every { repository.findById(1) } returns User(1, "John Doe")
val user = service.getUser(1)
then("올바른 사용자가 반환되어야 한다") {
user.name shouldBe "John Doe"
}
}
}
})
실제 서비스 계층을 테스트하는 예제를 살펴보겠습니다.
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
class UserServiceTest : BehaviorSpec({
given("사용자 조회 서비스") {
val repository = mockk<UserRepository>()
val service = UserService(repository)
`when`("존재하는 사용자를 조회할 때") {
every { repository.findById(1) } returns User(1, "Alice")
val result = service.getUser(1)
then("해당 사용자 정보가 반환되어야 한다") {
result.name shouldBe "Alice"
}
verify(exactly = 1) { repository.findById(1) }
}
}
})