gpt4 book ai didi

android - 延迟对 Kotlin 协程进行单元测试

转载 作者:IT老高 更新时间:2023-10-28 13:28:56 28 4
gpt4 key购买 nike

我正在尝试对使用 delay() 的 Kotlin 协程进行单元测试。对于单元测试,我不关心 delay(),它只是减慢了测试速度。我想以某种在调用 delay() 时实际上不会延迟的方式运行测试。

我尝试使用委托(delegate)给 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() 方法,我不知道如何将其委托(delegate)给默认调度程序。

最佳答案

如果您不希望有任何延迟,为什么不简单地在调度调用中恢复继续?:

class TestUiContext : CoroutineDispatcher(), Delay {
override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) {
continuation.resume(Unit)
}

override fun dispatch(context: CoroutineContext, block: Runnable) {
//CommonPool.dispatch(context, block) // dispatch on CommonPool
block.run() // dispatch on calling thread
}
}

这样 delay() 将毫无延迟地恢复。请注意,这仍然会延迟暂停,因此其他协程仍然可以运行(例如 yield())

@Test
fun `test with delay`() {
runBlocking(TestUiContext()) {
launch { println("launched") }
println("start")
delay(5000)
println("stop")
}
}

无延迟运行并打印:

start
launched
stop

编辑:

您可以通过自定义 dispatch 函数来控制继续运行的位置。

关于android - 延迟对 Kotlin 协程进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47171302/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com