使用Robolectric测试AndroidX项目遇ClassNotFoundException问题求助
这个问题的核心是Jetifier没有正确转换第三方库AudiencePlus中的旧Support库引用,再加上你使用的Robolectric 4.2版本对AndroidX的兼容支持不够完善,导致测试沙箱里找不到对应的AndroidX类,反而去加载已废弃的旧Support类,最终抛出ClassNotFoundException。
下面是具体的解决步骤:
1. 升级Robolectric到适配AndroidX的新版本
Robolectric 4.2是2019年的旧版本,对AndroidX和Jetifier的支持存在明显局限。建议直接升级到最新稳定版(比如当前的4.12.1),新版本修复了大量AndroidX兼容问题:
修改app模块的build.gradle:
testImplementation "org.robolectric:robolectric:4.12.1"
2. 调整测试Runner与配置
你的测试类用了@RunWith(AndroidJUnit4::class),这个Runner默认是给真机/模拟器上的Instrumented测试用的,Robolectric单元测试需要适配专属的Runner,同时指定目标SDK版本避免类加载异常:
修改测试类代码:
package com.company.app.room.ecat.dao import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @RunWith(RobolectricTestRunner::class) // 指定与项目目标SDK匹配的版本,这里以Android 13(API 33)为例 @Config(sdk = [33]) class MyDaoTest { @Test fun myMethodTest() { } }
3. 强制Jetifier处理所有依赖
虽然你已经开启了android.enableJetifier=true,但可以添加额外配置确保Jetifier不忽略任何依赖的转换:
在gradle.properties中添加:
android.jetifier.ignorelist=
这个配置会让Jetifier彻底转换所有依赖中的旧Support类,包括AudiencePlus内部的android.support.v4.app.NotificationCompat$Style,将其替换为AndroidX的androidx.core.app.NotificationCompat$Style。
4. 检查AudiencePlus是否有AndroidX专属版本
如果AudiencePlus官方提供了AndroidX适配的版本,直接替换依赖是最彻底的解决方式。比如原依赖如果是:
implementation 'com.pcg.ape:audience-plus:x.x.x'
可以查找是否有类似com.pcg.ape:audience-plus-androidx:x.x.x的AndroidX专属包,替换后就不需要Jetifier再做转换了。
5. 清理构建缓存
旧的构建缓存可能导致Jetifier转换不彻底,执行以下命令清理后重新构建:
./gradlew clean cleanBuildCache
为什么会加载非AndroidX类?
因为AudiencePlus库内部直接引用了旧的android.support.v4包下的类,而Robolectric 4.2的类加载沙箱没有正确应用Jetifier的转换规则,导致测试时没有去寻找转换后的AndroidX类,反而尝试加载已被项目废弃的旧Support类,最终抛出找不到类的异常。
内容的提问来源于stack exchange,提问作者rolandl

