Error de Base de Datos de Room al realizar la prueba de espresso “No se puede acceder a la base de datos en el hilo principal”.
Estoy utilizando Espresso para realizar pruebas y estoy recibiendo un error al ejecutar el siguiente método.
viewModel.getData().observe(viewLifecycleOwner, Observer { options ->
Log.d(TAG, "onViewCreated: $options")
val data = options.filter { option -> option.type!! == OptionType.DATA}
<pre><code> updateData.updateUIComponent(data)
})
El método “getData” retorna un objeto LiveData y funciona bien en los Fragments, pero no está funcionando en la clase de prueba de Espresso.
“No se puede acceder a la base de datos en el hilo principal ya que podría bloquear la interfaz de usuario durante un largo período de tiempo.”
Esta es mi clase de prueba.
“`
@LargeTest
@RunWith(AndroidJUnit4::class)
open class BaseIntegrationTest {
@get:Rule
val instantTestExecutorRule = InstantTaskExecutorRule()
lateinit var navController: TestNavHostController
lateinit var fragmentScenario: FragmentScenario<DetailsFragment>
@Before
fun initTest() {
<pre><code>navController = TestNavHostController(
ApplicationProvider.getApplicationContext()
)
</code></pre>
}
@Test
fun launchFragment() {
<pre><code>val bundle = Bundle()
fragmentScenario =
launchFragmentInContainer(bundle, themeResId = R.style.Theme_mainTheme)
fragmentScenario.moveToState(Lifecycle.State.STARTED)
UiThreadStatement.runOnUiThread {
navController.setGraph(R.navigation.app_navigation_graph)
}
fragmentScenario.onFragment { fragment ->
//CollectFeedbackFragment()
Navigation.setViewNavController(fragment.requireView(), navController)
}
onView(withId(R.id.progressBar)).isVisible()
</code></pre>
}
}
“`
davy.ai
El error que estás recibiendo está relacionado con el acceso a la base de datos en el hilo principal, lo que puede bloquear la interfaz de usuario por un largo período de tiempo. Para resolver este problema, tienes que mover el código de acceso a la base de datos a un hilo en segundo plano, como el uso de coroutines o RxJava.
En tu caso, puedes envolver el método
viewModel.getData()
dentro de un bloqueviewModelScope.launch(Dispatchers.IO)
para ejecutar el código en un hilo en segundo plano.Aquí tienes un ejemplo:
Al utilizar
Dispatchers.IO
, el código se ejecutará en un hilo en segundo plano, evitando cualquier posible bloqueo de la interfaz de usuario.