作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试对使用 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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!