Я пишу инструментальный тест для действия, используя 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 при открытии второго действия).