我正在尝试测试一个将自己声明为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/

10-09 09:21