小编Osc*_*uit的帖子

为什么测试中的 Kotlin Flow 会跳过延迟?

提供一些背景信息:我正在尝试测试一个内部有延迟的流程。为了很好地测试它,我想在某些时间断言值,因此我必须控制虚拟时间。然而,delay(...)似乎在测试中被跳过。举个例子:

@Test
fun test(dispatcher: TestDispatcher) = runTest(dispatcher) {
    flow {
        emit(1)
        delay(10000)
        emit(2)
    }
        .flowOn(dispatcher)
        .test {
            assertEquals(1, awaitItem())
            assertEquals(2, awaitItem())
            awaitComplete()
        }
}
Run Code Online (Sandbox Code Playgroud)

在示例中,我预计会assertEquals(2, awaitItem())超时,因为advanceTimeBy(10001)没有被调用以超过延迟。然而,这个测试成功完成,所以它只是跳过了延迟。

有人知道这是为什么吗?我如何实现我想要的?

PSTestDispatcher 是一个JUnit5扩展提供的,在测试之前StandardTestDispatcher也会调用。流程上来自Turbine库。本示例使用的版本:Dispatchers.setMain.test { }

  • 科特林:1.6.21
  • Kotlin 协程:1.6.1
  • 涡轮机:0.8.0
  • JUnit5:5.8.2

PPS 仅使用协程,行为就符合预期。以下面的例子为例。如果删除该advanceTimeBy测试将不再有效。

@Test
fun coroutineTest(dispatcher: TestDispatcher) = runTest(dispatcher) {
    var number = 0
    launch {
        number = 1
        delay(10_000)
        number = 2
    }
    
    advanceTimeBy(10_001)
    assertEquals(2, number)
}
Run Code Online (Sandbox Code Playgroud)

unit-testing kotlin kotlin-coroutines kotlin-flow

5
推荐指数
1
解决办法
1636
查看次数