有没有一种变通办法来模拟在有工具的测试期间打开的第二个活动的注入视图模型?

时间:2019-01-23 16:43:20

标签: android kotlin dagger-2 android-espresso instrumented-test

我正在使用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)的同时进行活动。

0 个答案:

没有答案