🎭 Mocking
📖 什么是Mocking?
Mocking是一种在测试中使用假对象代替真实对象的技术。您可以移除外部依赖(数据库、API等),使测试快速且稳定!
💡 MockK设置
build.gradle.kts
dependencies {
testImplementation("io.mockk:mockk:1.13.5")
}
🎯 基本用法
创建Mock
import io.mockk.*
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
interface UserRepository {
fun findById(id: String): User?
fun save(user: User): User
}
data class User(val id: String, val name: String)
class BasicMockTest {
@Test
fun `Mock 기본 사용`() {
// Mock 생성
val repo = mockk<UserRepository>()
// 동작 정의
every { repo.findById("123") } returns User("123", "홍길동")
// 테스트
val user = repo.findById("123")
assertEquals("홍길동", user?.name)
// 검증
verify { repo.findById("123") }
}
}
处理多次调用
class MultipleCalls {
@Test
fun `여러 번 호출`() {
val repo = mockk<UserRepository>()
// 첫 번째는 null, 두 번째는 User 반환
every { repo.findById("123") } returnsMany listOf(
null,
User("123", "홍길동")
)
assertEquals(null, repo.findById("123"))
assertEquals("홍길동", repo.findById("123")?.name)
}
}
🎨 实践示例
测试Service
class UserService(private val repository: UserRepository) {
fun getUserName(id: String): String {
val user = repository.findById(id)
return user?.name ?: "Unknown"
}
fun createUser(name: String): User {
val user = User(generateId(), name)
return repository.save(user)
}
private fun generateId() = "ID-${System.currentTimeMillis()}"
}
class UserServiceTest {
@Test
fun `사용자 조회 성공`() {
// Given
val repo = mockk<UserRepository>()
every { repo.findById("123") } returns User("123", "홍길동")
val service = UserService(repo)
// When
val name = service.getUserName("123")
// Then
assertEquals("홍길동", name)
verify { repo.findById("123") }
}
@Test
fun `사용자 없을 때`() {
val repo = mockk<UserRepository>()
every { repo.findById("999") } returns null
val service = UserService(repo)
val name = service.getUserName("999")
assertEquals("Unknown", name)
}
}