当前位置: 首页 > 知识库问答 >
问题:

具有延迟的Kotlin协式的单元测试

景令秋
2023-03-14

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

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)
    }
}

共有1个答案

姬飞飙
2023-03-14

如果您不希望有任何延迟,为什么不简单地恢复日程呼叫中的继续?:

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函数来控制继续运行的位置。

 类似资料:
  • 问题内容: 假设我有一个任务要从java.util.concurrent.BlockingQueue中提取元素并进行处理。 如果可以动态更改频率,我该如何安排/重新安排任务? 想法是获取数据更新流并将其批量传播到GUI 用户应该能够更改更新频率 问题答案: 我认为您无法更改固定速率的延迟。我认为您需要使用schedule()执行一次操作,并在完成后再次计划(如果需要,可以更改超时)。

  • 我正在制作一个待办事项列表应用程序,并有3种自定义单元格类型。对于任务单元格,它只是左侧的图像视图和右侧的文本视图。我希望单元格在文本视图文本对于单行来说太大时自动调整大小。 我已经添加了正确的约束,并将其添加到viewWillAppear中 但是,当进入带有tableview的视图时,单元格会在一秒钟内保持较小,然后扩展到正确的大小。此外,在最初添加任务时,单元格不会调整大小,除非返回并再次打开

  • 我正在尝试它,在尝试单元测试我的ViewModel时遇到了一个问题。我想要实现的目标:测试我的在我的ViewModel中以正确的顺序接收所有状态值。 我代码如下: ViewModel: 编辑:作为一个临时解决方案,我将它作为一个实时数据进行测试:

  • 问题内容: 我需要在循环中对数据库进行SQL查询: 更好的方法是:保持原样或循环后移动: 或者是其他东西 ? 问题答案: 整个要点是直到函数返回才执行,因此将其放置在要关闭的资源打开后的适当位置。但是,由于要在循环内创建资源,因此根本不要使用defer- 否则,在函数退出之前,您不会关闭在循环内创建的任何资源,因此它们会堆积直到然后。相反,您应该在每次循环迭代结束时关闭它们, 而无需 :

  • 本文向大家介绍js延迟加载的方式有哪些?相关面试题,主要包含被问及js延迟加载的方式有哪些?时的应答技巧和注意事项,需要的朋友参考一下 defer 属性 async 属性 动态创建DOM方式 使用jQuery的getScript方法 使用setTimeout延迟方法 让JS最后加载

  • 我有一个简单的模式,如下所示 为了找到CEP检测时间的延迟,添加了在如上所示的模式中选择每个事件的时间。每个事件类都有一个参数Edtl(事件检测时间本地),该参数最初设置为0,然后再设置为系统。nanoTime() 我在执行时遇到以下错误,但问题是该错误是在程序运行一段时间后出现的 我想我设置这个模式是因为我在模式中同时进行读取和写入操作。如果是这样,那么我应该如何在Flink CEP中找到平均复