在 Kotlin Android 工程中,Mock 数据通常用于测试或开发阶段隔离依赖。以下是常见的 Mock 方法及示例:
一、单元测试中 Mock 数据
1. 使用 Mock 框架(推荐 MockK)
-
依赖配置 (
build.gradle
):kotlintestImplementation "io.mockk:mockk:1.13.8" // 基础 MockK testImplementation "io.mockk:mockk-agent-jvm:1.13.8" // 支持静态/构造方法 Mock
-
示例:Mock 接口或类
kotlinimport io.mockk.every import io.mockk.mockk class UserRepositoryTest { // 创建 Mock 对象 private val apiService = mockk<ApiService>() @Test fun testGetUser() { // 设置 Mock 行为 every { apiService.getUser("123") } returns User(id = "123", name = "Mock User") // 执行测试 val result = UserRepository(apiService).getUser("123") assert(result.name == "Mock User") } }
2. 手动创建 Fake 实现
-
适用场景 :替代复杂依赖(如数据库、网络请求)
kotlinclass FakeUserRepository : UserRepository { override fun getUser(id: String): User { return User(id = id, name = "Fake User") } } // 在测试中使用 @Test fun testViewModel() { val viewModel = UserViewModel(FakeUserRepository()) viewModel.loadUser("123") assert(viewModel.user.value?.name == "Fake User") }
二、模拟网络请求(使用 MockWebServer
)
1. 依赖配置:
kotlin
testImplementation "com.squareup.okhttp3:mockwebserver:4.12.0"
2. 示例:
kotlin
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
class ApiServiceTest {
private val server = MockWebServer()
@Before
fun setup() {
server.start(8080)
}
@Test
fun testMockApiResponse() {
// 模拟成功响应
server.enqueue(MockResponse().setBody("""{"id": "123", "name": "Mocked User"}"""))
val apiService = RetrofitClient.create(server.url("/"))
val response = apiService.getUser("123").execute()
assert(response.body()?.name == "Mocked User")
}
@After
fun teardown() {
server.shutdown()
}
}
三、UI 测试中 Mock 数据(Espresso + Hilt)
1. 使用 Hilt 替换依赖
-
定义测试模块:
kotlin@Module @TestInstallIn(components = [SingletonComponent::class], replaces = [RepositoryModule::class]) object FakeRepositoryModule { @Provides fun provideUserRepository(): UserRepository = FakeUserRepository() }
-
UI 测试类:
kotlin@HiltAndroidTest class MainActivityTest { @get:Rule val hiltRule = HiltAndroidRule(this) @Before fun init() { hiltRule.inject() } @Test fun testDisplayUser() { val scenario = launchActivity<MainActivity>() onView(withId(R.id.tv_username)).check(matches(withText("Fake User"))) } }
四、开发阶段快速 Mock 数据
1. 临时使用静态数据
kotlin
// 在 ViewModel 或 Presenter 中
fun loadUser() {
// 开发阶段直接返回 Mock 数据
_user.value = User(id = "1", name = "Dev Mock User")
}
五、关键工具总结
工具/方法 | 适用场景 | 特点 |
---|---|---|
MockK | 单元测试中 Mock 类和接口 | 对 Kotlin 语法支持最佳 |
MockWebServer | 模拟网络 API 响应 | 精准控制 HTTP 请求/响应 |
Hilt 测试模块 | UI 测试中替换依赖 | 与 DI 框架无缝集成 |
Fake 实现 | 替代复杂依赖(如数据库) | 代码更可控,适合长期维护 |
根据具体场景选择合适的方法,单元测试推荐优先使用 MockK,UI 测试结合 Hilt 或 Espresso 进行依赖替换。