Cómo probar un fragmento usando Espresso

Tengo un fragmento de Android que quiero probar. He creado una actividad de prueba a la que agrego este fragmento y ejecuto algunas pruebas de Espresso.

Sin embargo, Espresso no encuentra ninguna de las vistas dentro del fragmento. Detiene la jerarquía de vista y está todo vacío.

No quiero usar la actividad real de los padres. Quiero probar este fragmento de forma aislada. ¿Alguien ha hecho esto? ¿Hay un ejemplo que tiene un código similar?

@RunWith(AndroidJUnit4.class) class MyFragmentTest { @Rule public ActivityTestRule activityRule = new ActivityTestRule<>( TestActivity.class); @Test public void testView() { MyFragment myFragment = startMyFragment(); myFragment.onEvent(new MyEvent()); // MyFragment has a recyclerview. //OnEvent is EventBus callback that in this test contains no data. //I want the fragment to display empty list text and hide the recyclerView onView(withId(R.id.my_empty_text)).check(matches(isDisplayed())); onView(withId(R.id.my_recycler)).check(doesNotExist())); } private MyFragment startMyFragment() { FragmentActivity activity = (FragmentActivity) activityRule.getActivity(); FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); MyFragment myFragment = new MyFragment(); transaction.add(myFragment, "myfrag"); transaction.commit(); return myFragment; } } 

Voy a hacer de la siguiente manera Crear una ViewAction de la siguiente manera:

 public static ViewAction doTaskInUIThread(final Runnable r) { return new ViewAction() { @Override public Matcher<View> getConstraints() { return isRoot(); } @Override public String getDescription() { return null; } @Override public void perform(UiController uiController, View view) { r.run(); } }; } 

A continuación, utilice a continuación para iniciar el código que se debe ejecutar en la interfaz de usuario

 onView(isRoot()).perform(doTaskInUIThread(new Runnable() { @Override public void run() { //Code to add your fragment or anytask that you want to do from UI Thread } })); 

A continuación se muestra un ejemplo de caso de prueba añadiendo jerarquía de vista de fragmentos

  @Test public void testSelectionOfTagsAndOpenOtherPage() throws Exception{ Runnable r = new Runnable() { @Override public void run() { //Task that need to be done in UI Thread (below I am adding a fragment) } }; onView(isRoot()).perform(doTaskInUIThread(r)); } 
 public class VoiceFullScreenTest { @Rule public ActivityTestRule activityRule = new ActivityTestRule<>( TestActivity.class); @Test public void fragment_can_be_instantiated() { activityRule.getActivity().runOnUiThread(new Runnable() { @Override public void run() { VoiceFragment voiceFragment = startVoiceFragment(); } }); // Then use Espresso to test the Fragment onView(withId(R.id.iv_record_image)).check(matches(isDisplayed())); } private VoiceFragment startVoiceFragment() { TestActivity activity = (TestActivity) activityRule.getActivity(); FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); VoiceFragment voiceFragment = new VoiceFragment(); transaction.add(voiceFragment, "voiceFragment"); transaction.commit(); return voiceFragment; } } 

Puede iniciar su fragmento de hilo de interfaz de usuario como se mencionó anteriormente.

Probablemente se haya olvidado de inyectar el fragmento en la jerarquía de vistas. Trate de definir el contenedor de su fragmento en el diseño de TestActivity (como un FrameLayout con id fragment_container ) y luego en lugar de simplemente add(myFragment, "tag") , use el add(R.id.fragment_container, myFragment, "tag") ( Este método ). Supongo que podrías usar el método replace con la misma firma.

Puede utilizar FragmentTestRule .

En lugar de la regular ActivityTestRule debe utilizar:

 @Rule public FragmentTestRule<?, FragmentWithoutActivityDependency> fragmentTestRule = FragmentTestRule.create(FragmentWithoutActivityDependency.class); 

Puedes encontrar más detalles en esta entrada del blog .

  • Android Studio 2.3 no tiene el especificador Test Instrumentation en la interfaz de usuario
  • Android Espresso: el filtrado de prueba no es compatible con la versión dada de JUnit. Actualice la versión de JUnit por lo menos a 4.6
  • Android - Fragmento independiente herramienta de prueba de interfaz de usuario
  • Android Marshmallow: Prueba permisos con Espresso?
  • Cómo realizar varias pruebas en Android afirmando brindis
  • ¿Cómo se supone que el sharding de prueba funciona?
  • ¿Cómo conseguir que Spoon tome capturas de pantalla para las pruebas de Espresso?
  • ¿Cómo esbozar imágenes de selección con intenciones Espresso?
  • Informe vacío de Jacoco para Android Espresso
  • ¿Cómo depurar las pruebas de instrumentación en Android Studio?
  • Uso de Espresso ¿Cómo puedo comprobar el número de elementos en mi alerta Cuadro de diálogo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.