在运行kotlin suspend方法的单元测试时(使用withContext(Dispatchers.Main)),测试方法失败,出现以下异常:

My coroutine lib versions are kotlinx-coroutines-core:1.1.1 and kotlinx-coroutines-android:1.1.1

Example:

suspend fun methodToTest() {
        withContext(Dispatchers.Main) {
           doSomethingOnMainThread()
                val data = withContext(Dispatchers.IO) {
                    doSomethingOnIOThread()
                }
        }
    }

而且,当我移除withContext(Dispatchers.Main)时,效果很好.

java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize. For tests Dispatchers.setMain from kotlinx-coroutines-test module can be used

at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:79)
at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:54)
at kotlinx.coroutines.DispatchedKt.resumeCancellable(Dispatched.kt:373)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:152)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)

推荐答案

You don't have access to Dispatchers.Main in unit testing

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/

Dispatchers.Main Delegation part explains in detail what you need to do.

Kotlin相关问答推荐

使用数据存储首选项Kotlin Jetpack Compose

Kotlin 说不需要强制转换,但删除后会出现新警告

Kotlin - 如何避免在密封类的 when() 语句中转换第二个变量

在 Compose 中使用 Text() 时如何获取文本的大小?

如何创建扩展函数isNullOrEmpty?

compareBy 如何使用布尔表达式在 kotlin 中工作

多次运行espresso测试

Kotlin 1.2.21 + SimpleXml 2.3.0 - consume List error (must mark set get method)

将 jetpack compose 添加到现有元素

调用单元测试验证伴随对象方法

从代码块执行和返回(在 Elvis 运算符之后)

Kotlin如何分派invoke操作符?

Kotlin中的下划线名称是为什么保留的?

在kotlin中,如何模拟封装回调函数?

如何将vararg转换为list?

无法在Kotlin中使用argb color int值?

使用主构造函数时使用Kotlin getter/setter

如果作为 RxJava Observable 提供,Kotlin 密封类子类需要强制转换为基类

IllegalStateException:function = , count = 3, index = 3

如何在 Kotlin 中按字母顺序对字符串进行排序