kotlin 如何在协程中获取虚拟时间戳?

pkwftd7m  于 2023-04-12  发布在  Kotlin
关注(0)|答案(1)|浏览(106)

我想以一种可测试的方式在函数中获取时间戳。使用像getTimeMillis这样的函数在测试中不起作用,因为runTest会跳过延迟。另一方面,TestScope.currentTime只在测试中起作用。我需要一种在两种情况下都有效的方法。

suspend fun getCurrentTime(): Long {
  return // what to do here? 
}

@Test
fun testMyCode() = runTest {
  delay(20)

  assertThat(this.currentTime).isEqualTo(20)
  assertThat(getCurrentTime()).isEqualTo(20)
}

我找到了DelayController,但它已被弃用。是否有其他方法从当前CoroutineContext获取时间戳?

t1qtbnec

t1qtbnec1#

我想我找到了一个可行的方法:

val CoroutineContext.nanoTime : Long
  get() = (this[ContinuationInterceptor] as? TestDispatcher)
    ?.scheduler?.currentTime?.times(1_000_000)
    ?: System.nanoTime()

你可以这样使用它:

suspend fun getCurrentTime(): Long {
  return coroutineContext.nanoTime / 1_000_000
}

我仍然很惊讶这不是一个语言特性tbh。

相关问题