第 61 课2026.09.24
精确测试异步任务在截止时间前不会提前完成,并在截止时执行。
第 61 课:比较边界前一毫秒与到期时刻
- 日期:2026-09-24
- 课程序号:第 61 课
- 知识点:分段推进测试时钟
用途或适用场景
精确测试异步任务在截止时间前不会提前完成,并在截止时执行。
核心概念
先推进到 999 毫秒,再推进 1 毫秒到边界;advanceTimeBy 不执行恰好位于最终边界的任务,随后 runCurrent 才执行。
最小代码或操作示例
kotlin
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun checksBothSides() = runTest {
var done = false
launch { delay(1_000); done = true }
runCurrent()
advanceTimeBy(999)
assertFalse(done)
advanceTimeBy(1)
assertFalse(done)
runCurrent()
assertTrue(done)
}沿用第 59 课的 commonTest 依赖与导入。
3~5 分钟练习
把延迟改为 2 秒,并保持“到期前 1 毫秒”断言。
参考答案
将 delay 改为 2_000,第一次推进量改为 1_999,第二次仍推进 1 毫秒;最终 runCurrent() 后 done 为 true。
与上一课的联系
沿用第 60 课的 done、advanceTimeBy 和边界处的 runCurrent();本课只把一次推进拆为 999 毫秒加 1 毫秒,以验证边界两侧;完成后下一课可测试多个不同延迟任务的执行顺序。
时效校验
时效校验:2026-09-24(kotlinx-coroutines-test 1.11.0 官方 advanceTimeBy 与 runCurrent API;均标注实验性,示例显式 opt-in,未标注废弃)。