运行Android Espresso测试时遭遇NoClassDefFoundError问题求助
这个问题我之前帮开发者排查过好几次,核心原因大多是依赖版本不兼容或者依赖冲突导致的类加载失败,咱们一步步来解决:
统一Espresso相关依赖的版本
你当前用的runner:0.5、rules:0.5和espresso-core:2.2.2版本不匹配,这是最常见的诱因。Espresso的runner/rules版本需要和核心库版本对应上,建议把runner和rules升级到和espresso-core兼容的版本,比如:androidTestCompile 'com.android.support.test:runner:1.0.2' androidTestCompile 'com.android.support.test:rules:1.0.2' androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.2'(注:如果你的项目还是用support库而非AndroidX,这个版本组合是稳定兼容的;如果已经迁移到AndroidX,需要换成对应的AndroidX依赖,比如
androidx.test:runner:1.4.0之类的)调整依赖排除规则
你排除了support-annotations和support-v4,但Espresso内部可能依赖这些库的特定版本,过度排除会导致缺失必要的类。建议只排除真正冲突的模块,而不是盲目排除整个组的库。比如如果只是support-annotations有冲突,可以只排除这个模块,并且确保项目中使用的annotations版本和Espresso依赖的版本一致:androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') { exclude group: 'com.android.support', module: 'support-annotations' }如果不确定冲突来源,可以先暂时注释掉所有排除规则,运行测试看看是否还崩溃,再逐步排查冲突点。
清理项目缓存
Android Studio的缓存有时候会导致依赖加载异常,执行以下操作:- 点击菜单栏的
File -> Invalidate Caches / Restart,选择Invalidate and Restart - 手动删除项目根目录下的
.gradle文件夹和app/build文件夹,然后重新执行gradle clean和gradle assembleDebugAndroidTest命令
- 点击菜单栏的
检查测试类的配置
确保你的测试类正确继承了AndroidJUnit4,并且注解配置正确,比如:import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @RunWith(AndroidJUnit4.class) public class MyEspressoTest { @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class); @Test public void testSample() { // 你的测试代码 } }
按照上面的步骤逐一排查,基本能解决这个NoClassDefFoundError的问题。
内容的提问来源于stack exchange,提问作者Diego Plentz

