如何使用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
相关产品推荐
相关产品推荐

