Espresso测试无法访问类文件,报‘包不存在’等错误求助
你在运行Espresso UI测试时碰到的这些编译错误,核心问题是测试代码的依赖被错误地强制排除,再加上几处配置冲突,导致测试类找不到必要的类文件。下面是具体的分析和修复步骤:
错误原因拆解
从你的build.gradle配置来看,最后那段自动排除依赖的代码是主要诱因:
configurations.compile.dependencies.each { compileDependency -> println "排除编译依赖项: ${compileDependency.getName()}" configurations.androidTestCompile.dependencies.each { androidTestCompileDependency -> configurations.androidTestCompile.exclude module: "${compileDependency.getName()}" } }
这段代码会把compile配置里的所有依赖(比如support-v4、support-v7、guava)都从androidTestCompile中排除,而这些恰恰是测试代码必须用到的库——这就直接导致了AppCompatActivity、RecyclerView、checkArgument这类符号找不到的错误。
另外,你在android块里重复设置了buildToolsVersion,先使用root配置的25.0.2,又手动改成26.0.2,这也可能引发编译工具版本不一致的冲突。
具体修复步骤
1. 删除错误的依赖排除代码
直接删掉那段自动排除依赖的代码块,它完全是画蛇添足,反而破坏了测试依赖的正常引用逻辑。
2. 统一Build Tools版本
把android块里重复的buildToolsVersion '26.0.2'删掉,保持和root配置一致的25.0.2,避免版本冲突干扰编译。
3. 调整Espresso Contrib依赖(可选但推荐)
espresso-contrib经常会引入和项目版本不一致的support库,建议在依赖声明时主动排除冲突模块,修改androidTestCompile里的espresso-contrib:
androidTestCompile ("com.android.support.test.espresso:espresso-contrib:$rootProject.ext.espressoVersion") { exclude group: 'com.android.support', module: 'appcompat-v7' exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'design' exclude group: 'com.android.support', module: 'recyclerview-v7' }
这样可以避免Espresso自带的support库和你项目中的版本冲突。
4. 同步Gradle并重新测试
做完以上修改后,点击Android Studio的Sync Project with Gradle Files按钮,同步完成后再重新运行你的UI测试,编译错误应该会全部消失。
修改后的核心依赖配置示例
调整后的dependencies和configurations部分应该类似这样:
dependencies { // 应用核心依赖 compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" compile "com.android.support:cardview-v7:$rootProject.supportLibraryVersion" compile "com.android.support:design:$rootProject.supportLibraryVersion" compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion" compile "com.android.support:support-v4:$rootProject.supportLibraryVersion" compile "com.google.guava:guava:$rootProject.guavaVersion" compile "com.github.bumptech.glide:glide:$rootProject.glideVersion" compile "com.android.support.test.espresso:espresso-idling-resource:$rootProject.ext.espressoVersion" // 本地单元测试依赖 testCompile "junit:junit:$rootProject.ext.junitVersion" testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion" testCompile "org.hamcrest:hamcrest-all:$rootProject.ext.hamcrestVersion" testCompile "org.powermock:powermock-module-junit4:$rootProject.ext.powerMockito" testCompile "org.powermock:powermock-api-mockito:$rootProject.ext.powerMockito" // Android测试支持库 androidTestCompile "com.android.support.test:runner:$rootProject.ext.runnerVersion" androidTestCompile "com.android.support.test:rules:$rootProject.ext.rulesVersion" // Espresso UI测试依赖 androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.ext.espressoVersion" androidTestCompile ("com.android.support.test.espresso:espresso-contrib:$rootProject.ext.espressoVersion") { exclude group: 'com.android.support', module: 'appcompat-v7' exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'design' exclude group: 'com.android.support', module: 'recyclerview-v7' } androidTestCompile "com.android.support.test.espresso:espresso-intents:$rootProject.ext.espressoVersion" } // 锁定support-annotations版本,避免冲突 configurations.all { resolutionStrategy.force "com.android.support:support-annotations:$rootProject.supportLibraryVersion" }
内容的提问来源于stack exchange,提问作者TheDancerCodes

