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