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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:12:54