使用Robolectric测试EasyMVP+Kotlin Activity时presenter未初始化问题
解决Robolectric测试EasyMVP Activity时Presenter未初始化的问题
这个问题我之前也碰到过,核心原因是EasyMVP的注解处理器在Robolectric测试环境中没有及时完成Presenter的注入,导致Activity的onStart生命周期触发时,lateinit修饰的presenter字段还没被初始化,从而抛出UninitializedPropertyAccessException。下面给你几个可行的解决方案:
方案一:手动触发EasyMVP的注入逻辑
EasyMVP框架通常提供了手动注入的入口(比如MVP.inject()方法),你可以在Robolectric创建Activity后、触发生命周期前手动执行注入操作:
@Before fun initData() { // 先创建Activity控制器,不立即启动 val activityController = Robolectric.buildActivity(AccessActivity::class.java) val activity = activityController.get() // 手动调用EasyMVP的注入方法,确保Presenter被初始化 MVP.inject(activity) // 具体方法名请参考EasyMVP官方文档,可能略有不同 // 手动触发Activity的生命周期(create -> start -> resume) activityController.create().start().resume() this.activity = activity loginEditText = activity.findViewById(R.id.loginEditText) passwordEditText = activity.findViewById(R.id.passwordEditText) }
方案二:使用Mock模拟Presenter(推荐,更适合单元测试)
单元测试的核心是解耦,与其依赖框架的注入逻辑,不如直接用Mock工具(比如Mockito-Kotlin)模拟一个Presenter实例,手动赋值给Activity的presenter字段:
第一步:添加Mockito依赖
在你的build.gradle.kts(或build.gradle)中添加测试依赖:
dependencies { // 其他依赖... testImplementation "org.mockito.kotlin:mockito-kotlin:4.1.0" testImplementation "org.mockito:mockito-core:4.11.0" }
第二步:修改测试代码
import org.mockito.kotlin.mock @Before fun initData() { // 模拟AccessPresenter实例 val mockPresenter = mock<AccessPresenterImpl>() // 创建Activity val activity = Robolectric.setupActivity(AccessActivity::class.java) // 给Activity的presenter字段赋值(如果是internal修饰,同模块测试可直接访问;否则用反射) // 直接访问方式(同模块): activity.presenter = mockPresenter // 如果是private或跨模块,用反射: // val field = AccessActivity::class.java.getDeclaredField("presenter") // field.isAccessible = true // field.set(activity, mockPresenter) this.activity = activity loginEditText = activity.findViewById(R.id.loginEditText) passwordEditText = activity.findViewById(R.id.passwordEditText) }
这种方式不仅能解决初始化问题,还能方便你验证Presenter的方法调用,让测试更可控。
方案三:确保测试环境启用注解处理器
如果你的测试模块没有配置EasyMVP的注解处理器,也会导致注入失败。在build.gradle.kts中添加测试注解处理器依赖:
dependencies { // 其他依赖... kapt "com.github.EasyMVP:easy-mvp-processor:x.x.x" // 替换为你使用的版本 testKapt "com.github.EasyMVP:easy-mvp-processor:x.x.x" // 测试环境也启用注解处理 }
配置完成后,clean并重新构建项目,再运行测试。
内容的提问来源于stack exchange,提问作者Jakub Anioła
相关产品推荐
相关产品推荐

