我正在使用ActivityTestRule
编写一项针对活动的仪器化测试,该活动将通过按下被测(第一个)活动上的按钮来打开第二个活动。
问题是,第二个活动使用依赖项注入来注入视图模型工厂以创建其视图模型,但是在测试过程中,注入被禁用。相反,在直接测试第二个活动时,将包含模拟视图模型的自定义工厂设置为activity.viewModelFactory
,以模拟视图模型行为。但是在上述情况下,第一个活动尝试在禁用注入功能且没有手动设置的情况下打开第二个活动,因此测试将失败,并显示以下错误:
kotlin.UninitializedPropertyAccessException: lateinit property viewModelFactory has not been initialized
为了更好地了解这种情况,这是我尝试运行的测试:
@Test
fun testLogin() {
// ... mock server configuration
onView(withId(R.id.etEmail))
.perform(typeText("dummyUserName")) // enter username
onView(withId(R.id.etPassword))
.perform(typeText("dummyPassword"), closeSoftKeyboard()) // enter password
onView(withId(R.id.btLogin))
.perform(click()) // click on login: this is where the second activity will try to be opened and the error occurs.
}
这是第二个活动访问其视图模型的方式:
class SecondActivity : AppCompatActivity() {
@Inject // 1. injection is disabled during tests.
lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var viewModel: SecondActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
// 2. this line fails, because viewModelFactory is null.
viewModel = ViewModelProviders.of(this, viewModelFactory).get(SecondActivityViewModel::class.java)
}
...
}
考虑到这一点,我想知道是否存在一种避免打开第二个活动的解决方法(因为它的行为在这里无关紧要),或者是否有解决方案让包含第二个模拟视图模型的虚拟工厂被使用测试第一个活动(在打开第二个活动时如何初始化viewModelFactory)的同时进行活动。