Espresso: espera que la actividad finalice la tarea de fondo después de presionarBack ()

He mirado alrededor durante un tiempo sobre las pruebas de espresso y especialmente sobre los recursos personalizados de ralentí (he implementado un par de casos de trabajo), pero me he encontrado con un escenario que no puedo resolver.

Tengo una clase SearchUITest de Espresso que inicia una actividad para buscar cosas. Antes de realizar cualquier búsqueda abre SettingsActivity para realizar algunos cambios en la configuración de la aplicación. Al ejecutar el método pressBack () desde la actividad de configuración para volver a SearchActivity, se inicia una tarea en segundo plano (que no utiliza AsyncTask) para actualizar la configuración antes de volver a SearchActivity de nuevo.

El problema es que SearchActivity no se reanuda antes de que se haga la primera llamada para interactuar con su interfaz de usuario. Estoy recibiendo esta excepción (a veces obtengo el NoActivityResumedException y algunos otros NoMatchingViewException):

android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)? ... android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: 

¿Cómo puedo hacer que Espresso espere a que SettingsActivity termine su tarea en segundo plano y abra SearchActivity antes de ejecutar la siguiente oración de prueba. Dejo un poco de código para la aclaración adicional (estoy corriendo una prueba parametrizada con espresso por cierto):

 @RunWith(value = Parameterized.class) public class SearchByCountryE2ETest { private static List<Country> mCountriesList; private SearchActivity mActivity; private String countryID; private String countryLocation; private String countryLanguage; public SearchByCountryE2ETest(String countryID, String countryLocation, String language) { this.countryID = countryID; this.countryLocation = countryLocation; this.countryLanguage = language; } @Parameterized.Parameters(name = "id {0}, language{2}") public static Collection countryIDs() { return Arrays.asList(new Object[][]{ {"001", "mad", "Español (España)"}, {"002", "lon", "English (United Kingdom)"} }); } @Rule public ActivityTestRule<SearchActivity> mSearchActivityRule = new ActivityTestRule<>( SearchActivity.class); @Before public void setUp() throws Exception { mSearchActivityRule.getActivity(); if (mCountriesList == null) { mCountriesList = SingletonCommon.getInstance().getCountries().getCountry(); } } @Test public void testEnd2EndWithCountryID() { String countryName = getCountryNameById(countryID); if (countryName != null) { setCountryAndLanguage(countryName, countryLanguage); performCompleteSearch(); } } private void setCountryAndLanguage(String countryName, String countryLanguage) { openSettings(); changeLanguage(countryLanguage); changeCountry(countryName); pressBack(); waitMillis(3000); // this is where the settings background task to update config is started } public void performCompleteSearch() { setLocation(); clickViewWithId(R.id.search_button);//Go to filters activity onView(withId(R.id.search_button)).check(matches(isClickable()));//Check if results != 0 clickViewWithId(R.id.search_button);//Go to listing activity waitMillis(1000); // wait millis is just a call to SystemClock.sleep(millis); openListingDetailAtPosition(1);// Click on item an open detail view pressBack(); } private void openListingDetailAtPosition(int position) { onView(withId(R.id.recycler_view)) .perform(scrollToPosition(position)); onRecyclerViewItemAtPosition(click(), R.id.recycler_view, position); } private void openSettings() { onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); onData(anything()).inAdapterView(withId(R.id.drawer_list_view)).atPosition(SETTINGS_DRAWER_POSITION).perform(click()); } private void changeLanguage(String countryLanguage){ if (countryLanguage != null && !countryLanguage.isEmpty()) { clickOnSpinnerStringItem(R.id.spinner_list_language, countryLanguage); } } private void changeCountry(String countryName){ clickOnSpinnerStringItem(R.id.spinner_list_countries, countryName); } private void setLocation() { clickViewWithId(R.id.geolocation_edit_text); enterTextIntoViewWithId(countryLocation, R.id.location_edit_text); waitMillis(500); onRecyclerViewItemAtPosition(click(), R.id.locations_list, DEFAULT_SELECTED_LOCATION_POSITION); onView(withId(R.id.geolocation_edit_text)).perform(closeSoftKeyboard()); } 

}

He tenido que añadir waitMillis (millis) llamadas para esperar a que la aplicación termine de cargar las tareas de fondo para las actividades abiertas de SearchActivity porque no he sido capaz de crear y registrar recursos inactivos para las actividades abiertas después de la que inicia el prueba. También agradecería mucho si hay un ejemplo completo sobre cómo hacer esto (registrar recursos inactivos para diferentes actividades abiertas a lo largo de la ejecución de la prueba).

Si alguna aclaración adicional es necesaria por favor dígame. Gracias de antemano por cualquier ayuda.

  • Cómo detectar si la aplicación de Android está ejecutando la prueba de interfaz de usuario con Espresso
  • No hay identificación para mi prueba de interfaz de usuario de Android
  • No se puede ejecutar Robotium en Android Studio con sólo APK
  • Cómo rotar la actividad, quiero decir: el cambio de orientación de la pantalla con Espresso?
  • Comprobación de ViewPager con Espresso. ¿Cómo funciona la acción a un botón de un elemento?
  • No se puede conseguir que Robotium funcione en Android Studio
  • Manera correcta de abrir NavigationDrawer y seleccionar elementos en Robotium
  • Android Espresso ListView haga clic en el elemento
  • Android: Robotium vs marco de prueba de Android
  • ¿Cómo usar Espresso UI Testing for React Native?
  • No se pudo iniciar intención Intent en un plazo de 45 segundos - robotium
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.