junit 对MainCoroutineRule使用UnconfinedTestDispatcher()时,TestCoroutineRule()未初始化

vm0i2vca  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(121)

将coroutinesKotlinVersion更新到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。
供参考-

@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()
    }
}

Kotlin协同程序的扩展

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"
yduiuuwa

yduiuuwa1#

所以发现内部kotlinx-coroutines-test:1.7.1正在尝试使用kotlin-stdlib:1.8.10。但是由于我们的用例,我们强制任何基于Kotlin的库使用1.7.20,因此使kotlinx-coroutines-test:1.7.1也使用kotlin-stdlib:1.7.20。它似乎是它的一些兼容性问题(向后兼容性)与kotlinx-coroutines-test:1.7.1的旧Kotlin版本。

相关问题