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

如何在Kotlin Espresso测试中至少推进45分钟时间

在Espresso中快速模拟闲置45分钟的解决方案

方法1:直接修改系统时间(需测试权限)

如果用模拟器或者root过的测试设备,可以直接调用SystemClock.setCurrentTimeMillis()跳转到未来时间,触发闲置跳转逻辑:

val now = System.currentTimeMillis()
// 在主线程执行时间修改
InstrumentationRegistry.getInstrumentation().runOnMainSync {
    SystemClock.setCurrentTimeMillis(now + 45 * 60 * 1000)
}

// 验证是否成功跳转到首页
onView(withId(R.id.home_layout)).check(matches(isDisplayed()))

注意:需要在测试Manifest中添加android.permission.SET_TIME权限,并且测试设备要授予该权限。

方法2:Mock时间API(推荐)

如果你的App是通过SystemClock.elapsedRealtime()或System.currentTimeMillis()计算闲置时长,用Mockito静态Mock替换这些方法的返回值,无需修改系统时间,也不会影响其他测试:

先在gradle中添加Mockito-inline依赖(支持静态Mock):

androidTestImplementation 'org.mockito:mockito-inline:4.8.1'

测试代码示例:

// 静态Mock SystemClock,作用域限定在use块内
mockStatic(SystemClock::class.java).use { mockedClock ->
    val initialTime = SystemClock.elapsedRealtime()
    // 模拟返回45分钟后的时间
    mockedClock.`when`<Long> { SystemClock.elapsedRealtime() }.thenReturn(initialTime + 45 * 60 * 1000)

    // 如果App用Handler定时检测闲置,可能需要触发Looper让检测逻辑执行
    InstrumentationRegistry.getInstrumentation().runOnMainSync {
        Looper.myLooper()?.quitSafely()
        Looper.prepare()
        Looper.loop()
    }

    // 验证首页是否显示
    onView(withId(R.id.home_layout)).check(matches(isDisplayed()))
}

方法3:使用AndroidX Test的ClockRule

如果你的App使用androidx.core.os.Clock或java.time相关API处理时间,可以用AndroidX Test提供的ClockRule快速推进时间:

@get:Rule
val clockRule = ClockRule()

@Test
fun testIdleTimeoutToHome() {
    // 直接推进45分钟
    clockRule.advanceTimeBy(Duration.ofMinutes(45))

    // 验证跳转结果
    onView(withId(R.id.home_layout)).check(matches(isDisplayed()))
}

注意:这个方法要求App代码依赖Clock类获取时间,若当前代码直接调用SystemClock,需要先调整适配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:01:18