Kotlin传递类类型参数,实现Espresso测试等待指定Activity出现
实现Espresso等待指定Activity出现的方法(无需修改生产代码)
我完全理解你不想通过IdlingResource修改生产代码的顾虑,这确实是个值得坚持的好原则!下面给你一个纯基于测试侧API实现的方案,不用侵入生产代码就能等待目标Activity出现:
核心实现思路
我们可以借助AndroidX Test提供的UiDevice工具来轮询当前前台Activity的类名,直到找到目标Activity或者超时,全程不需要修改任何生产代码。
完整方法代码
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import java.util.concurrent.TimeUnit /** * 等待指定类型的Activity出现,超时则抛出断言错误 * @param targetActivityClass 目标Activity的Class对象 * @param timeoutSeconds 超时时间,默认10秒 */ fun waitForActivity(targetActivityClass: Class<*>, timeoutSeconds: Long = 10) { val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) val endTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(timeoutSeconds) // 循环轮询检查当前Activity while (System.currentTimeMillis() < endTime) { val currentActivityFullName = device.currentActivityName // 对比当前Activity的全类名和目标类名 if (currentActivityFullName == targetActivityClass.name) { return // 找到目标Activity,结束等待 } // 短暂休眠,避免过度消耗资源 Thread.sleep(100) } // 超时未找到,抛出错误终止测试 throw AssertionError("等待Activity ${targetActivityClass.simpleName} 超时(已等待${timeoutSeconds}秒)") }
测试中如何使用
在你的Espresso测试用例里,执行完跳转操作后直接调用这个方法即可:
import org.junit.Test import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @Test fun testJumpToDetailActivity() { // 1. 触发跳转到目标Activity的操作(比如点击列表项) onView(withId(R.id.item_list_first)).perform(click()) // 2. 等待DetailActivity出现 waitForActivity(DetailActivity::class.java) // 3. 现在可以安全地对DetailActivity中的控件做断言或操作了 onView(withId(R.id.detail_title)).check(matches(isDisplayed())) }
注意事项
- 确保测试依赖中包含UiAutomator库,在
build.gradle(Module级别)中添加:androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' - 如果你用的是Java,只需要调整语法(比如把
::class.java换成.class,异常抛出语句微调),逻辑完全一致 - 可以根据测试场景调整
timeoutSeconds和休眠时间(Thread.sleep(100)),平衡等待效率和准确性 - 这种轮询方式虽然不是Espresso推荐的声明式风格,但在无法使用IdlingResource的场景下,是非常实用的替代方案
内容的提问来源于stack exchange,提问作者Stonz2
相关产品推荐
相关产品推荐

