kotlin - 如何使用runBlocking等待CoroutineScope完成

标签 kotlin kotlin-coroutines

我正在尝试测试一个将自己声明为CoroutineScope的类。该类具有一些在其范围内用launch作业的方法,我必须从测试方法中断言这些作业的效果。

这是我尝试过的:

import kotlinx.coroutines.*

class Main : CoroutineScope {
    override val coroutineContext get() = Job()

    var value = 0

    fun updateValue() {
        this.launch {
            delay(1000)
            value = 1
        }
    }
}

fun main() {
    val main = Main()
    val mainJob = main.coroutineContext[Job]!!
    main.updateValue()
    runBlocking {
        mainJob.children.forEach { it.join() }
    }
    require(main.value == 1)
}

我的期望是updateValue()将在coroutineContext中创建根作业的子级。但是事实证明mainJob.children为空,所以我等不及完成launch,并且require语句失败。

使这项工作正确的方法是什么?

最佳答案

我的代码中的错误很简单:

override val coroutineContext get() = Job()

我不小心留下了一个自定义 setter/getter ,这意味着每次对coroutineContext的访问都会创建一个新作业。自然,我在测试代码中找到的工作没有 child 。删除get()可使代码正常工作:
override val coroutineContext = Job()

关于kotlin - 如何使用runBlocking等待CoroutineScope完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53277906/

相关文章:

android - 圆形进度指示器忽略宽度/高度属性并且不缩放

android - 将对象列表传递给 fragment

kotlin - 尽管有保障,但我的Kotlin代码中仍然存在NullPointerException

android - 状态值更改时屏幕不重组 - Jetpack Compose

android - emitAll 直到另一个操作完成?

android - Jetpack Compose 滚动 LazyColumn with CoroutineScope 结果错误 A MonotonicFrameClock 在此 CoroutineContext 中不可用

spring-security - 解决 Kotlin 中的意外覆盖错误

kotlin - 在 Kotlin 中使用安全调用运算符对相似代码产生不同结果

android - 从 Firebase 监听器发出状态 - Kotlin Flow

android - 如何从 rxjava flatmap 调用协程用例