如何在Android测试模块与App模块间共享代码?Fake依赖难题
解决Android测试模块间共享Fake类的依赖问题
你不需要为所有内容重复创建Fake,直接让test-shared模块依赖App模块的核心代码即可,具体步骤如下:
1. 创建test-shared模块
新建一个Android Library类型的模块(命名为test-shared),专门存放test和androidTest共享的测试代码。
2. 配置test-shared的依赖
在test-shared模块的build.gradle.kts(或build.gradle)中添加对App模块的依赖,确保能访问到App里的Repository接口、DTO类等核心代码:
// test-shared/build.gradle.kts plugins { id("com.android.library") id("org.jetbrains.kotlin.android") } android { compileSdk = 34 namespace = "com.yourpackage.testshared" defaultConfig { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } sourceSets { getByName("main") { java.srcDirs("src/main/kotlin") } } } dependencies { // 依赖App模块,获取核心的接口、数据模型等 implementation(project(":app")) // 测试必备依赖 testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") // 协程测试依赖(按需添加) testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3") }
3. 迁移共享测试代码
把你的FakeRepository等需要共享的测试类移到test-shared模块的src/main/kotlin目录下(main源码集的代码可同时被test和androidTest访问)。
你的FakeRepository代码可直接复用,只要App模块中的CryptoRepository是公开接口、CoinDto等类为公开(Kotlin默认公开),就能正常编译:
class FakeRepository : CryptoRepository { override suspend fun getCoinData(): List<CoinDto> { val data = CoinDto( id = "id", is_active = true, is_new = true, name = "Test Coin", rank = 1, symbol = "Test Symbol", type = "Test Type" ) return listOf(data) } override suspend fun getCoinDetails(id: String): CoinDetailsDto { return CoinDetailsDto( description = "Test Description", developmentStatus = "Test Status", firstDataAt = "Test Data At", hardwareWallet = true, hashAlgorithm = "Test Hash Algorithm", id = "id", isActive = true, isNew = true, lastDataAt = "Test Last Data At", links = fakeLink, linksExtended = fakeLinksExtended, logo = "https://static.coinpaprika.com/coin/bnb-binance-coin/logo.png", message = "Test Message", name = "Test Coin Name", openSource = true, orgStructure = "Test Org Structure", proofType = "Test Proof Type", rank = 1, startedAt = "Test Started At", symbol = "TTC", tags = listOf(fakeTag), team = listOf(fakeTeamMember), type = "Test Type" ) } override suspend fun getPriceCoinDetails(id: String): CoinPriceDetailsDtoItem { return CoinPriceDetailsDtoItem( beta_value = 0.5, circulating_supply = 1000L, first_data_at = "Test First Data At", id = "id", last_updated = "Test Last Data At", max_supply = 10000L, name = "Tes Coin Name", quotes = fakeQuotes, rank = 1, symbol = "TTC", total_supply = 1000L ) } }
4. 在App模块中依赖test-shared
最后在App模块的build.gradle.kts中添加依赖,让test和androidTest都能调用共享代码:
// app/build.gradle.kts dependencies { // ...其他业务依赖 // 本地单元测试依赖test-shared testImplementation(project(":test-shared")) // 仪器化测试依赖test-shared androidTestImplementation(project(":test-shared")) }
关键说明
- 无需冗余Fake:只维护一份Fake类,即可在两种测试环境中复用。
- 依赖核心契约:仅依赖App模块的接口、数据模型等测试必需的契约类,符合测试隔离原则。
- 接口优先:确保
CryptoRepository是接口而非具体实现,Fake类才能正确模拟依赖。
内容的提问来源于stack exchange,提问作者sam_1234
相关产品推荐
相关产品推荐

