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
相关产品推荐
相关产品推荐

