PHpullh
학습 라이브러리/Kotlin/MockK를 사용한 모킹

KOTLIN · 테스트

MockK를 사용한 모킹

MockK 라이브러리로 Kotlin 친화적인 목 객체를 생성합니다. 코루틴, 확장 함수, object 모킹을 지원합니다.

테스트중급mockkmockingtest-doublecoroutine-mock

핵심 설명

MockK 라이브러리로 Kotlin 친화적인 목 객체를 생성합니다. 코루틴, 확장 함수, object 모킹을 지원합니다.

Kotlin code

// MockK 개념 시뮬레이션 (실제: io.mockk:mockk)
// 실제 코드 예시:

interface UserRepository {
    suspend fun findById(id: String): String?
    suspend fun save(name: String): String
}

class UserService(private val repo: UserRepository) {
    suspend fun getOrCreate(id: String, defaultName: String): String {
        return repo.findById(id) ?: repo.save(defaultName)
    }
}

// 수동 목 (MockK 없이)
class MockUserRepository : UserRepository {
    val findCalls = mutableListOf<String>()
    val saveCalls = mutableListOf<String>()
    var findResult: String? = null
    var saveResult: String = ""

    override suspend fun findById(id: String): String? {
        findCalls.add(id)
        return findResult
    }
    override suspend fun save(name: String): String {
        saveCalls.add(name)
        return saveResult
    }
}

fun main() = kotlinx.coroutines.runBlocking {
    // 테스트: 사용자 없으면 생성
    val mock = MockUserRepository().apply {
        findResult = null
        saveResult = "new-user"
    }
    val service = UserService(mock)
    val result = service.getOrCreate("id-1", "기본이름")

    assert(result == "new-user") { "생성 실패" }
    assert(mock.findCalls == listOf("id-1")) { "find 호출 검증" }
    assert(mock.saveCalls == listOf("기본이름")) { "save 호출 검증" }
    println("모든 테스트 통과!")
}

학습 팁

MockK의 coEvery { }로 suspend 함수를 모킹하고, coVerify { }로 호출을 검증합니다.

주의할 점

모든 것을 모킹하면 테스트가 구현 세부사항에 결합됩니다. 핵심 의존성만 모킹하고, 값 객체는 실제 인스턴스를 사용하세요.

자주 묻는 질문

MockK를 사용한 모킹란 무엇인가요?

MockK 라이브러리로 Kotlin 친화적인 목 객체를 생성합니다. 코루틴, 확장 함수, object 모킹을 지원합니다.

MockK를 사용한 모킹 학습 시 주의할 점은 무엇인가요?

모든 것을 모킹하면 테스트가 구현 세부사항에 결합됩니다. 핵심 의존성만 모킹하고, 값 객체는 실제 인스턴스를 사용하세요.