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

如何使用Robolectric测试Activity未发生路由跳转的场景?

没问题,我来帮你搞定这个Robolectric测试场景!要验证用户已注册时HomeActivity不会跳转到AuthActivity,核心思路就是模拟已注册状态,然后检查是否没有启动目标Activity,下面是具体的步骤和代码示例:

1. 确保依赖到位

首先确认你的测试依赖里已经包含了Robolectric和Mock框架(这里用MockK举例,Mockito也可以),在build.gradle.kts(或build.gradle)里添加:

testImplementation("org.robolectric:robolectric:4.12.1")
testImplementation("io.mockk:mockk:1.13.8")
testImplementation("junit:junit:4.13.2")
testImplementation("androidx.test.ext:junit:1.1.5")

2. 编写测试类

我们需要mock你的UserPreference类,让它返回memberRegistered = true,然后启动HomeActivity,最后验证没有启动AuthActivity:

@RunWith(RobolectricTestRunner::class)
class HomeActivityTest {

    @MockK
    private lateinit var mockUserPreference: UserPreference

    @Before
    fun setup() {
        // 初始化MockK注解
        MockKAnnotations.init(this)
        // 模拟用户已注册的状态
        every { mockUserPreference.memberRegistered } returns true

        // 把mock的UserPreference注入到HomeActivity中
        // 这里假设HomeActivity中的userPreference是private属性,所以用反射替换
        val userPrefField = HomeActivity::class.java.getDeclaredField("userPreference")
        userPrefField.isAccessible = true
        userPrefField.set(activity, mockUserPreference)
    }

    @Test
    fun `when user is registered, should not navigate to AuthActivity`() {
        // 启动HomeActivity并执行onCreate生命周期
        val homeActivity = Robolectric.buildActivity(HomeActivity::class.java)
            .create()
            .get()

        // 获取Robolectric记录的所有已启动Activity
        val startedActivities = ShadowApplication.getInstance().startedActivities

        // 检查是否没有启动AuthActivity
        val authActivityWasStarted = startedActivities.any {
            it.component.className == AuthActivity::class.java.name
        }

        // 断言:AuthActivity没有被启动
        assertThat(authActivityWasStarted).isFalse()
    }
}

关键细节说明

  • Mock UserPreference:因为我们要控制memberRegistered的返回值,所以用MockK创建一个模拟对象,避免依赖真实的SharedPreference存储。
  • 反射注入:如果你的userPreference是HomeActivity里的私有属性,需要通过反射把mock对象替换进去;如果项目用了依赖注入框架(比如Hilt),可以直接在测试模块提供mock实例,不用反射,会更优雅。
  • 验证跳转:Robolectric的ShadowApplication会记录所有通过startActivity启动的Activity,我们通过检查这个列表来确认AuthActivity没有被启动。

如果你的项目用JUnit5,只需要把@RunWith(RobolectricTestRunner::class)换成@ExtendWith(RobolectricExtension::class)即可,其他逻辑基本一致。

内容的提问来源于stack exchange,提问作者Albert Gao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:49