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를 사용한 모킹 학습 시 주의할 점은 무엇인가요?
모든 것을 모킹하면 테스트가 구현 세부사항에 결합됩니다. 핵심 의존성만 모킹하고, 값 객체는 실제 인스턴스를 사용하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.