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

Compose Multiplatform:单元测试任务误执行插桩测试致CI失败求助

解决Compose Multiplatform单元测试误执行插桩测试的问题

问题根源

你添加的instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test)配置会将commonTest源码集同时关联到Android单元测试(JVM环境)和插桩测试(Android设备/模拟器环境)任务中。单元测试运行时没有Android Runtime支持,执行到依赖Android SDK的插桩测试代码时,就会出现android.os.Build.FINGERPRINT为空的空指针异常。

解决方案

1. 拆分测试源码集

将测试代码按运行环境拆分:

  • 把不依赖Android API的通用测试(比如纯逻辑测试、跨平台Compose UI测试的通用逻辑)留在commonTest
  • 把依赖Android SDK的插桩测试(比如需要Android上下文、createAndroidComposeRule的测试)移到androidInstrumentedTest源码集

2. 调整Gradle配置

修改Android和KMP的Gradle配置,明确区分单元测试和插桩测试的源码集关联:

android {
    // 可选:禁止单元测试包含Android资源,进一步隔离环境
    testOptions {
        unitTests {
            includeAndroidResources = false
        }
    }
}

kotlin {
    android {
        instrumentedTestVariant {
            // 让插桩测试仅关联commonTest和androidInstrumentedTest源码集
            @OptIn(ExperimentalKotlinGradlePluginApi::class)
            sourceSetTree.set(KotlinSourceSetTree.instrumentedTest)
        }
        // 单元测试默认关联commonTest和androidUnitTest,无需额外修改
    }
    // ...其他平台(iOS、Desktop等)的配置
}

3. 执行正确的CI任务

  • 运行Android单元测试:执行./gradlew testDebugUnitTest
  • 运行Android插桩测试:执行./gradlew connectedDebugAndroidTest(需要连接设备或模拟器)

额外提示

如果你的commonTest中存在依赖Android API的代码,必须将这部分迁移到androidInstrumentedTest。Compose UI测试中,createAndroidComposeRule仅能在插桩环境运行,而createComposeRule可用于JVM单元测试,注意区分使用。

内容的提问来源于stack exchange,提问作者Marco Pierucci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:07:07