Android项目模块间共享测试类的实现方案咨询
我之前也碰到过完全一样的困扰——不想把测试代码塞进main目录增加发布依赖,也不想为了共享测试代码多建一个库。后来发现Android Gradle Plugin(AGP)7.0+自带的Test Fixtures就是专门解决这个问题的,完美符合你的需求!
步骤1:在Library模块启用Test Fixtures
首先在你的library模块的build.gradle(或build.gradle.kts)里开启Test Fixtures支持,并把共享测试代码的依赖移到testFixturesImplementation配置下(这些依赖只会用于测试,不会进入发布的AAR):
Groovy DSL
android { // 保留你原有的android配置(compileSdk、defaultConfig等) testFixtures { enable = true } } dependencies { // 你的library正常依赖 implementation 'androidx.core:core-ktx:1.12.0' // 共享测试代码需要的依赖,比如JUnit、Mockito testFixturesImplementation 'junit:junit:4.13.2' testFixturesImplementation 'org.mockito:mockito-core:5.6.0' }
Kotlin DSL
android { // 原有的android配置 testFixtures { enable.set(true) } } dependencies { implementation("androidx.core:core-ktx:1.12.0") testFixturesImplementation("junit:junit:4.13.2") testFixturesImplementation("org.mockito:mockito-core:5.6.0") }
步骤2:迁移共享测试代码
把你原来放在src/androidTest/java下的通用测试类,移到library模块的src/testFixtures/java目录下(如果这个目录不存在,直接新建即可)。这个目录是Test Fixtures的默认源码目录,里面的代码只会被测试构建引用,完全不会影响library的发布产物。
如果需要自定义源码路径,也可以在sourceSets里配置:
android { sourceSets { testFixtures { java.srcDir 'src/customTestShared/java' // 自定义路径 } } }
步骤3:在App模块引用Library的Test Fixtures
最后在你的app模块的build.gradle里,添加对library测试夹具的依赖:
Groovy DSL
dependencies { // 正常引用library的发布代码 implementation project(':your-library-module') // 引用library的共享测试代码 androidTestImplementation testFixtures(project(':your-library-module')) }
Kotlin DSL
dependencies { implementation(project(":your-library-module")) androidTestImplementation(testFixtures(project(":your-library-module"))) }
这样一来,app模块的androidTest代码就能直接导入library里testFixtures目录下的类了,而且library的发布构建完全不会包含这些测试代码和依赖,完美解决了你的痛点!
旧版AGP(低于7.0)的兼容方案
如果你的项目还在使用AGP 7.0以下的版本,没法用Test Fixtures,可以手动通过自定义Gradle配置来实现:
Library模块配置
// 自定义一个配置用于共享测试代码 configurations { androidTestShared } android { sourceSets { androidTest { // 把共享测试代码目录加入源码集(可以用你原来的androidTest目录,或者单独新建一个) java.srcDirs += 'src/androidTestShared/java' } } } // 打包共享测试代码为Jar task androidTestSharedJar(type: Jar) { from android.sourceSets.androidTest.java // 如果需要共享测试资源,加上这行 // from android.sourceSets.androidTest.res } // 把Jar关联到自定义配置 configurations.androidTestShared.outgoing.artifact androidTestSharedJar // 给自定义配置添加测试依赖 dependencies { androidTestSharedImplementation 'junit:junit:4.13.2' }
App模块配置
dependencies { androidTestImplementation project(path: ':your-library-module', configuration: 'androidTestShared') }
不过这个手动方案不如官方Test Fixtures优雅,建议尽量升级到AGP 7.0+版本使用官方方案。
内容的提问来源于stack exchange,提问作者Anthony

