首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带延迟的Kotlin协程单元测试

带延迟的Kotlin协程单元测试
EN

Stack Overflow用户
提问于 2017-11-08 11:54:52
回答 2查看 12.8K关注 0票数 36

我正在尝试对一个使用delay()的Kotlin协程进行单元测试。对于单元测试,我并不关心delay(),它只会减慢测试速度。我希望以某种方式运行测试,使其在调用delay()时不会真正延迟。

我尝试使用委托给CommonPool的自定义上下文运行协程:

代码语言:javascript
复制
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()方法,我不知道如何将其委托给默认调度器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-06 00:51:53

在kotlinx.coroutines v1.2.1中,他们添加了kotlinx-coroutines-test模块。它包括runBlockingTest协程构建器,以及TestCoroutineScopeTestCoroutineDispatcher。它们允许自动提前时间,以及使用delay显式控制测试协程的时间。

票数 16
EN

Stack Overflow用户

发布于 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模块中,并且在此版本以上的标准协程库中将被标记为已弃用或不存在。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47171302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档