如何在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
相关产品推荐
相关产品推荐

