如何让Mock数据仅对Test和AndroidTest可见,避免主代码访问?
解决主应用代码可访问测试Mock数据的问题
核心思路
通过创建独立的测试辅助源码集,让单元测试(test)和Instrumented测试(androidTest)依赖该源码集,同时完全隔离主应用源码集的访问权限,彻底避免主代码导入Mock数据。
具体配置步骤
1. 配置Gradle源码集
在app/build.gradle(Groovy语法)中添加如下配置:
android { sourceSets { // 定义testHelper源码集,指定其源码目录 testHelper { java.srcDirs = ['src/testHelper/java'] resources.srcDirs = ['src/testHelper/resources'] } // 让单元测试依赖testHelper的编译输出 test { compileClasspath += testHelper.output runtimeClasspath += testHelper.output } // 让Instrumented测试依赖testHelper的编译输出 androidTest { compileClasspath += testHelper.output runtimeClasspath += testHelper.output } } } // 配置testHelper的依赖(和测试环境保持一致) dependencies { testHelperImplementation files(android.getBootClasspath()) testHelperImplementation 'junit:junit:4.13.2' // 添加Mock相关依赖,比如Mockito、MockK等 }
如果使用Kotlin DSL(build.gradle.kts),对应配置如下:
android { sourceSets { val testHelper by creating { java.srcDir("src/testHelper/java") resources.srcDir("src/testHelper/resources") } val test by getting { compileClasspath += testHelper.output runtimeClasspath += testHelper.output } val androidTest by getting { compileClasspath += testHelper.output runtimeClasspath += testHelper.output } } } dependencies { val testHelper by configurations testHelper(files(android.bootClasspath)) testHelper("junit:junit:4.13.2") // 添加Mock相关依赖 }
2. 调整目录结构
确保testHelper目录位于src下,遵循标准源码集结构:
app/src/ ├── main/ # 主应用源码 ├── test/ # 单元测试源码 ├── androidTest/ # Instrumented测试源码 └── testHelper/ └── java/ └── [你的包名]/AppMockData.kt/java
3. 验证效果
配置完成后,执行clean和compileDebugSources任务清理缓存并编译主代码,此时主应用代码尝试导入AppMockData会直接报编译错误,而测试代码仍可正常访问Mock数据。
原配置无效的原因
直接将testHelper目录添加到test和androidTest的java.srcDirs,本质是让测试源码集将该目录视为自身的源码目录,但Gradle的源码集隔离机制可能因路径配置不规范或缓存问题失效。使用独立源码集的方式是官方推荐的规范做法,能彻底避免主源码集访问测试专属代码。
内容的提问来源于stack exchange,提问作者Nie Selam
相关产品推荐
相关产品推荐

