Android多模块测试依赖配置:如何在module-a测试中访问module-base测试代码
解决Android模块间测试源码依赖问题
嘿,这个问题我太熟悉了!在Gradle里直接用testImplementation project(':module-base')确实拿不到对方的测试源码,这是因为Gradle默认的模块依赖只会关联主源码的编译产物,测试源集属于模块内部的“私有”代码,不会自动对外暴露。下面给你两种靠谱的解决办法:
方法一:直接关联测试源集(简单直接)
如果只是小项目快速解决,可以直接在module-a的build.gradle里配置测试源集,让它包含module-base的测试源码目录:
android { sourceSets { // 针对单元测试(test目录) test { java.srcDirs += project(':module-base').sourceSets.test.java.srcDirs // 如果有测试资源文件,也同步添加 resources.srcDirs += project(':module-base').sourceSets.test.resources.srcDirs } // 如果需要访问Instrumented测试(androidTest目录)的代码,同理配置 androidTest { java.srcDirs += project(':module-base').sourceSets.androidTest.java.srcDirs resources.srcDirs += project(':module-base').sourceSets.androidTest.resources.srcDirs } } }
这种方法的好处是不用额外打包操作,但缺点是如果module-base的测试依赖了其他库,你得手动在module-a里也添加相同的依赖,不然会出现编译报错。
方法二:通过Gradle配置发布测试构件(规范推荐)
如果是中大型项目,更推荐用这种方式,符合Gradle的依赖管理规范,还能自动传递测试依赖:
第一步:在module-base的build.gradle中配置测试构件
// 定义单元测试构件的配置,继承testImplementation的依赖链 configurations { testArtifacts.extendsFrom testImplementation } // 创建任务打包单元测试代码的输出产物 task assembleTestArtifacts(type: Jar) { from sourceSets.test.output } // 将打包后的产物绑定到testArtifacts配置,供其他模块依赖 artifacts { testArtifacts assembleTestArtifacts } // 如果需要支持Instrumented测试,同步配置对应的构件 configurations { androidTestArtifacts.extendsFrom androidTestImplementation } task assembleAndroidTestArtifacts(type: Jar) { from sourceSets.androidTest.output } artifacts { androidTestArtifacts assembleAndroidTestArtifacts }
第二步:在module-a的build.gradle中依赖测试构件
dependencies { // 依赖module-base的单元测试构件 testImplementation project(path: ':module-base', configuration: 'testArtifacts') // 如果需要访问Instrumented测试代码,添加这个依赖 androidTestImplementation project(path: ':module-base', configuration: 'androidTestArtifacts') }
这样配置后,不仅能拿到module-base的测试源码,它的测试依赖也会自动传递过来,不用手动重复添加相同依赖。
注意事项
- 确保两个模块的Gradle环境配置一致(比如都是Android Studio 3.0 + Gradle 4.5)
- 如果使用了AndroidX或特定测试框架,要保证依赖版本匹配
内容的提问来源于stack exchange,提问作者kotoMJ




