我正在尝试对一个使用delay()的Kotlin协程进行单元测试。对于单元测试,我并不关心delay(),它只会减慢测试速度。我希望以某种方式运行测试,使其在调用delay()时不会真正延迟。
我尝试使用委托给CommonPool的自定义上下文运行协程:
class TestUiContext : CoroutineDispatcher(), Delay {
suspend override fun delay(time: Long, unit: TimeUnit) {
// I'd like it to call this
}
override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) {
// but instead it calls this
}
override fun dispatch(context: CoroutineContext, block: Runnable) {
CommonPool.dispatch(context, block)
}
}我希望我可以从上下文的delay()方法返回,但它调用的是我的scheduleResumeAfterDelay()方法,我不知道如何将其委托给默认调度器。
发布于 2019-09-06 00:51:53
在kotlinx.coroutines v1.2.1中,他们添加了kotlinx-coroutines-test模块。它包括runBlockingTest协程构建器,以及TestCoroutineScope和TestCoroutineDispatcher。它们允许自动提前时间,以及使用delay显式控制测试协程的时间。
发布于 2018-08-02 05:56:34
在kotlinx.coroutines v0.23.0中,他们引入了TestCoroutineContext。
优点:它使得使用delay真正测试协程成为可能。您可以将CoroutineContext的虚拟时钟设置为某个时刻,并验证预期的行为。
缺点:如果您的协程代码不使用delay,并且您只想让它在调用线程上同步执行,那么使用它比@bj0的答案中的TestUiContext稍微麻烦一些(您需要在TestCoroutineContext上调用triggerActions()来执行协程)。
附注:从协程1.2.1版开始,TestCoroutineContext现在位于kotlinx-coroutines-test模块中,并且在此版本以上的标准协程库中将被标记为已弃用或不存在。
https://stackoverflow.com/questions/47171302
复制相似问题