You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Robolectric 4.4下ShadowSystemClock无法推进时间问题求助

Robolectric 4.4 中 ShadowSystemClock 失效问题解决建议

1. 修正测试方法注解

测试方法使用小写的@test会导致JUnit无法识别执行,必须改为大写的@Test:

@Test 
fun testOne (){
     functionOne()
     ShadowSystemClock.advanceBy(60 * 1000)
     functionTwo()
}

2. 改用毫秒数调用 advanceBy

Robolectric 4.4 的ShadowSystemClock.advanceBy()仅接受long类型的毫秒数,不支持直接传入Duration对象,替换为毫秒数值:

// 推进1分钟(60*1000毫秒)
ShadowSystemClock.advanceBy(60 * 1000)

3. 明确初始化模拟时钟

测试开始前设置固定初始时间,确保时钟处于可模拟状态,避免依赖系统真实时间:

@Test 
fun testOne (){
     // 设置初始时间为固定值(示例:2020-09-13 12:26:40)
     ShadowSystemClock.setCurrentTimeMillis(1600000000000L)
     functionOne()
     ShadowSystemClock.advanceBy(60 * 1000)
     functionTwo()
}

4. 验证Shadow是否生效

若问题仍存在,可直接打印时间确认Shadow是否拦截成功:

@Test 
fun testOne (){
     ShadowSystemClock.setCurrentTimeMillis(1600000000000L)
     println("初始时间:${System.currentTimeMillis()}") // 应输出1600000000000
     ShadowSystemClock.advanceBy(60 * 1000)
     println("推进后时间:${System.currentTimeMillis()}") // 应输出1600000060000
}

如果打印值未变化,需检查:

  • @Config中的shadows = [ShadowSystemClock::class]是否正确配置,未被其他配置覆盖
  • 被测类是否直接调用System.currentTimeMillis(),而非自定义时间工具类(若有自定义工具类,需为其编写Shadow类)

5. 适配Android系统Clock方法

如果被测类调用的是android.os.SystemClock.currentTimeMillis(),ShadowSystemClock同样可以覆盖,但需确保调用路径正确,上述初始化和推进方法通用。

内容的提问来源于stack exchange,提问作者RxPleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:22:53