Android开发:如何测试ScrollView滚动时isCalled()函数是否被调用
测试实现方案
前置依赖配置(未引入相关依赖时需要添加)
在模块级build.gradle的依赖节点添加如下配置:
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'org.mockito:mockito-android:4.11.0' androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.3' }
方案1:Mockito验证(无侵入业务代码的优先方案)
不需要修改原有业务逻辑,直接通过spy监听目标方法调用即可,适配自带的1秒延时:
@get:Rule var activityScenarioRule = activityScenarioRule<MainActivity>() @Test fun checkScrollEventTriggerIsCalled() { var targetActivity: MainActivity? = null // 获取Activity实例并包装为spy对象,用于监听方法调用 activityScenarioRule.scenario.onActivity { activity -> targetActivity = Mockito.spy(activity) } // 执行滑动操作触发滚动监听 Espresso.onView(ViewMatchers.withId(R.id.scrollVw)).perform(ViewActions.swipeDown()) // 等待延时任务执行完成,验证isCalled方法被调用1次 Mockito.verify(targetActivity, Mockito.timeout(1500).times(1))?.isCalled() }
方案2:标记位验证(无Mockito依赖的轻量方案)
需要少量修改业务代码,添加测试用标记位即可:
第一步:修改MainActivity业务代码
// 测试用标记位,可通过BuildConfig.DEBUG包裹避免带到生产包 var isCalledTriggered = false fun isCalled() { isCalledTriggered = true // 原有isCalled的业务逻辑保留 }
第二步:编写测试逻辑
@get:Rule var activityScenarioRule = activityScenarioRule<MainActivity>() @Test fun checkScrollEventTriggerIsCalled() { var targetActivity: MainActivity? = null activityScenarioRule.scenario.onActivity { activity -> targetActivity = activity // 测试前重置标记位 targetActivity!!.isCalledTriggered = false } // 执行滑动操作 Espresso.onView(ViewMatchers.withId(R.id.scrollVw)).perform(ViewActions.swipeDown()) // 等待1.5秒确保延时任务执行完成 Thread.sleep(1500) // 断言标记位状态符合预期 assert(targetActivity?.isCalledTriggered == true) }
优化建议
如果要避免使用Thread.sleep,可以给原有延时逻辑接入Espresso的CountingIdlingResource,让Espresso自动等待异步任务执行完成,无需硬编码等待时间。
注意:如果isCalled为私有方法,建议调整为包级私有或抽离到独立可测试类,避免反射带来的测试不稳定性
内容的提问来源于stack exchange,提问作者Vibhuti
相关产品推荐
相关产品推荐

