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

如何使用Kotlin版Espresso实现不重启应用的顺序测试

问题根因
  • 你当前使用的ActivityScenarioRule标注了@get:Rule,属于JUnit4的方法级规则,默认每个测试方法执行前后都会分别启动、销毁Activity,这是每次测试重启应用的核心原因
  • 你混用了JUnit4的注解(@Rule/@Before/@Test)和JUnit5的@BeforeAll注解,两类依赖不兼容,这是@BeforeAll标红无法使用的直接原因
解决方案(JUnit4 环境,适配现有代码)

不需要迁移到JUnit5,直接修改现有规则和注解配置即可实现需求:

  1. 把方法级规则@get:Rule改为类级规则@get:ClassRule,让Activity在整个测试类生命周期内只启动一次
  2. 替换@Before为@BeforeClass,保证初始化逻辑只在测试类启动时执行一次,kotlin环境下@BeforeClass方法需要放在companion object中并添加@JvmStatic注解
  3. 添加测试执行顺序注解,保证用例按你需要的顺序执行

修改后完整代码

import org.junit.FixMethodOrder
import org.junit.runners.MethodSorters
import androidx.test.rule.ActivityScenarioRule
import org.junit.ClassRule
import org.junit.BeforeClass
import org.junit.Test

// 配置按方法名字典序执行,也可按需使用@Order注解自定义顺序
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class Practice {

    companion object {
        @get:ClassRule
        @JvmStatic
        val activityRule = ActivityScenarioRule(MainActivity::class.java)

        @BeforeClass
        @JvmStatic
        fun setUp() {
            onView(withText("Log In With Mobile Code")).perform(click())
            onView(withResourceName("txtMobileAccessCode")).check(matches(withText("Company Code or\nMobile Access Code")))
        }
    }

    @Test
    fun step1_clickOnEnterAccessCode() {
        onView(withResourceName("txtCodeEntry")).perform(typeText("CodeGoesHere"))
    }

    @Test
    fun step2_enterCode() {
        onView(withResourceName("btnCodeSubmit")).perform(click())
    }

}
注意事项
  • 类级规则生效后,所有测试用例共享同一个Activity实例,前一个测试的操作状态会直接影响后一个测试,符合你存在前后依赖的测试场景
  • 若后续要使用JUnit5,需要完全移除JUnit4的相关依赖,统一使用JUnit5的注解体系,同时可直接手动管理ActivityScenario的生命周期,无需使用规则类

内容的提问来源于stack exchange,提问作者Gabriel Alfonso Miranda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:33:02