You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动