ZIO中使用Schedule.exponential测试重试效果时出现挂起问题求助
问题原因
使用Schedule.exponential时,重试间隔是指数增长的(默认底数为2):第一次重试等待10ms,第二次20ms,第三次40ms。你的测试仅调用了一次TestClock.adjust(10.milliseconds),只能触发第一次重试,但后续重试需要的时间未推进,导致测试挂起等待时钟前进。而单独使用Schedule.recurs时无时间间隔,无需调整时钟,因此测试正常运行。
解决方案
需要确保测试时钟推进到足够覆盖所有重试延迟的时间点,推荐使用TestClock.fastForward一次性推进足够时间,自动触发所有重试:
test("test retry exponential") { for { // 启动效果并转为后台执行 fiber <- ZIO.fail("fail") .retry( Schedule.exponential(10.milliseconds) && Schedule.recurs(3).tapOutput(o => ZIO.logInfo(s"retrying $o")) ) .fork // 快速推进时钟,覆盖所有重试所需的总延迟(10+20+40=70ms,这里用1秒确保足够) _ <- TestClock.fastForward(1.second) // 获取最终结果,重试3次后仍为失败 result <- fiber.join.either } yield assertTrue(result.isLeft) }
额外说明
原测试中的assertTrue(res == null)逻辑错误:因为重试3次后effect依然失败,代码不会走到yield环节,测试会直接失败。改用either捕获结果,断言其为失败状态才符合预期。
内容的提问来源于stack exchange,提问作者Ivan K.
相关产品推荐
相关产品推荐

