Mockk와 BDD 패턴을 이용하는 Kotest 테스트 코드 작성 가이드

숭맹이·2025년 2월 16일
0

Mockk와 BDD 패턴을 이용하는 Kotest 테스트 코드 작성 가이드

1. Kotest와 Mockk 소개

1.1 Kotest란?

Kotest는 Kotlin 기반의 테스트 프레임워크로, 직관적인 DSL과 다양한 스타일(BDD, StringSpec, ShouldSpec 등)을 지원합니다.

1.2 Mockk란?

Mockk는 Kotlin 전용 모킹 라이브러리로, Java의 Mockito보다 더 Kotlin 친화적인 문법을 제공합니다.

2. BDD 스타일의 테스트 작성하기

BDD 스타일은 테스트의 가독성을 높이고, 비개발자도 쉽게 이해할 수 있도록 돕습니다. Kotest의 BehaviorSpec을 활용하면 자연스러운 BDD 테스트를 작성할 수 있습니다.

2.1 기본적인 Kotest 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
            }
        }
    }
})

3. Mockk를 활용한 의존성 모킹

서비스 계층을 테스트할 때, 의존성을 모킹하면 테스트의 독립성을 유지할 수 있습니다.

3.1 Mockk 기본 사용법

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"
            }
        }
    }
})

4. Kotest + Mockk 활용 예제

실제 서비스 계층을 테스트하는 예제를 살펴보겠습니다.

4.1 서비스 계층 테스트 예제

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) }
        }
    }
})
profile
👨🏻‍💻 Backend Developer

0개의 댓글