提供一些背景信息:我正在尝试测试一个内部有延迟的流程。为了很好地测试它,我想在某些时间断言值,因此我必须控制虚拟时间。然而,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 { }
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)