Estoy escribiendo una prueba instrumentada para una actividad usando ActivityTestRule que abrirá una segunda actividad presionando un botón en la actividad bajo prueba (primera).
El problema es que la segunda actividad usa la inyección de dependencia para inyectar una fábrica de modelos de vista para crear su modelo de vista, pero durante las pruebas, la inyección está deshabilitada. En cambio, mientras se prueba directamente la segunda actividad, se establece una fábrica personalizada que contiene un modelo de vista simulado como activity.viewModelFactory para simular el comportamiento del modelo de vista. Pero en la situación explicada anteriormente, la primera actividad intenta abrir la segunda actividad con la inyección deshabilitada y tampoco configurada manualmente de fábrica, por lo que la prueba fallará con el siguiente error:
kotlin.UninitializedPropertyAccessException: lateinit property viewModelFactory has not been initializedPara tener una mejor imagen del escenario, esta es la prueba que estoy tratando de ejecutar:
@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. }Y así es como la segunda actividad accede a su modelo de vista:
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) } ... }Teniendo esto en cuenta, me preguntaba si existe una solución para evitar que se abra la segunda actividad (ya que su comportamiento es irrelevante aquí) o si existe una solución para que la fábrica ficticia que contiene el modelo de vista simulada se use en la segunda actividad durante la prueba. la primera actividad (cómo inicializar viewModelFactory cuando se abre la segunda actividad).