升级Kotlin协程至1.7.1后,UnconfinedTestDispatcher初始化MainCoroutineRule失败
问题现象
将Kotlin协程版本升级至1.7.1后,使用UnconfinedTestDispatcher创建MainCoroutineRule时出现类初始化失败错误:
Could not initialize class kotlinx.coroutines.test.TestCoroutineScheduler
java.lang.NoClassDefFoundError: Could not initialize class kotlinx.coroutines.test.TestCoroutineScheduler
at kotlinx.coroutines.test.TestCoroutineDispatchersKt.UnconfinedTestDispatcher(TestCoroutineDispatchers.kt:87)
at kotlinx.coroutines.test.TestCoroutineDispatchersKt.UnconfinedTestDispatcher$default(TestCoroutineDispatchers.kt:83)
at net.example.cellfish.MainCoroutineRule.<init>(MainCoroutineRule.kt:12)
at net.example.cellfish.search.viewmodel.SearchTransactionHistoryViewModelTest.<init>(SearchTransactionHistoryViewModelTest.kt:49)
将版本降级至1.6.4后,测试用例可正常初始化MainCoroutineRule。
相关代码
MainCoroutineRule实现
@OptIn(ExperimentalCoroutinesApi::class) class MainCoroutineRule constructor( val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() ) : TestWatcher() { override fun starting(description: Description) { super.starting(description) Dispatchers.setMain(testDispatcher) } override fun finished(description: Description) { super.finished(description) Dispatchers.resetMain() } }
协程依赖配置
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1" testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1"
问题原因及解决办法
原因
Kotlin协程1.7.x版本对测试模块的依赖结构和初始化逻辑做了调整,TestCoroutineScheduler类的加载容易受编译缓存残留、依赖版本不一致影响,从而触发NoClassDefFoundError。
解决步骤
- 清理编译缓存:执行Gradle的
clean任务,彻底清除旧编译产物,避免缓存中的旧类干扰。 - 保证依赖版本一致:确认所有协程相关依赖(core、android、test)的版本完全统一,禁止混合不同版本的协程依赖。
- 显式初始化调度器:修改
MainCoroutineRule构造函数,显式创建TestCoroutineScheduler并传入UnconfinedTestDispatcher,避免隐式初始化的异常:@OptIn(ExperimentalCoroutinesApi::class) class MainCoroutineRule constructor( val testScheduler: TestCoroutineScheduler = TestCoroutineScheduler(), val testDispatcher: TestDispatcher = UnconfinedTestDispatcher(testScheduler) ) : TestWatcher() { // 原有starting、finished逻辑保持不变 } - 升级至更高版本:官方在1.7.2及后续版本中修复了测试模块的部分类加载问题,升级到这些版本可直接解决该错误。
内容的提问来源于stack exchange,提问作者caffmaniac

