You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:50:21