¿Cómo puedo probar fragmentos con Robolectric?

Sé que hay un Robolectric.shadowOf(Fragment) y una clase ShadowFragment , que no están listados en los documentos, pero no puedo hacerlo funcionar.

 myFragment = new MyFragment(); myFragment.onCreateView(LayoutInflater.from(activity), (ViewGroup) activity.findViewById(R.id.container), null); myFragment.onAttach(activity); myFragment.onActivityCreated(null); 

Estoy trabajando con API nivel 13 (Honeycomb).

Gracias.

Editar # 4 & # 5 : En Robolectric 3. * , dividen las funciones de inicio del fragmento.

Para los fragmentos de soporte, necesitará agregar una dependencia a su build.gradle :

 testCompile "org.robolectric:shadows-support-v4:3.3.2" 

Importar: org.robolectric.shadows.support.v4.SupportFragmentTestUtil.startFragment;

Para fragmentos de plataforma, no necesita esta dependencia. Importar: import static org.robolectric.util.FragmentTestUtil.startFragment;

Ambos usan el mismo nombre de startFragment() .

 import static org.robolectric.shadows.support.v4.SupportFragmentTestUtil.startFragment; @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class) public class YourFragmentTest { @Test public void shouldNotBeNull() throws Exception { YourFragment fragment = YourFragment.newInstance(); startFragment( fragment ); assertNotNull( fragment ); } } 

Editar # 3 : Robolectric 2.4 tiene una API para soporte y fragmentos regulares . Puede utilizar el patrón newInstance() o utilizar el constructor al construir los Fragment .

 import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertNotNull; import static org.robolectric.util.FragmentTestUtil.startFragment; @RunWith(RobolectricGradleTestRunner.class) public class YourFragmentTest { @Test public void shouldNotBeNull() throws Exception { YourFragment fragment = new YourFragment(); startFragment( fragment ); assertNotNull( fragment ); } } 

Editar # 2 : Hay un nuevo ayudante si estás usando fragmentos de soporte ( uno que apoya actividades regulares / fragmentos debe estar en la próxima versión ):

 import static org.robolectric.util.FragmentTestUtil.startFragment; @Before public void setUp() throws Exception { fragment = YourFragment.newInstance(); startFragment( fragment ); } 

Editar : Si actualizó a Robolectric 2.0:

 public static void startFragment( Fragment fragment ) { FragmentActivity activity = Robolectric.buildActivity( FragmentActivity.class ) .create() .start() .resume() .get(); FragmentManager fragmentManager = activity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add( fragment, null ); fragmentTransaction.commit(); } 

Respuesta original

Como sugirió el otro comentador, es necesario utilizar el gestor de fragmentos (en lugar de llamar a los métodos de ciclo de vida que se enumeran anteriormente).

 @RunWith(MyTestRunner.class) public class YourFragmentTest { @Test public void shouldNotBeNull() throws Exception { YourFragment yourFragment = new YourFragment(); startFragment( yourFragment ); assertNotNull( yourFragment ); } 

Creo un corredor de prueba y tengo una función que arranca un fragmento para mí para poder usarlo en todas partes.

 public class MyTestRunner extends RobolectricTestRunner { public MyTestRunner( Class<?> testClass ) throws InitializationError { super( testClass ); } public static void startFragment( Fragment fragment ) { FragmentManager fragmentManager = new FragmentActivity().getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add( fragment, null ); fragmentTransaction.commit(); } } 

Todos ustedes están haciendo esto de la manera más difícil. Sólo use FragmentTestUtil.

 FragmentTestUtil.startFragment(yourfragment); 

Los fragmentos de soporte se han movido al módulo:

Sombras-soporte-v4

(A partir de julio de 2015, Robolectric v3.0)

Agregue una dependencia de gradle a app / build.gradle:

 testCompile 'org.robolectric:shadows-support-v4:3.0' 

A continuación, importe a su clase Robolectric java de prueba:

 import org.robolectric.shadows.support.v4.SupportFragmentTestUtil; 

A continuación, puede iniciar y utilizar un fragmento de soporte-v4 para realizar pruebas:

 @Test public void minimalFragmentTest() throws Exception { MyFunFragment fragment = new MyFunFragment(); SupportFragmentTestUtil.startVisibleFragment(fragment); assertThat(fragment.getView()).isNotNull(); } 

Referencias:

  • Github changelog , mover fragmentos de soporte a diferentes módulos

Estoy bastante seguro de que tiene que crear una FragmentTransaction utilizando el FragmentManager , entonces funcionará.

Sólo quería añadir que en Robolectric 2.0, incluso después de hacer:

 activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get(); fragment.show(activity.getSupportFragmentManager(), null); fragment.getDialog(); //This stills returns null 

Todavía regresó nulo para mí. Lo que hice fue añadir activity.getSupportFragmentManager().executePendingTransaction(); Y funcionó.

Parece robolectric no funciona esto por alguna razón. Parece que tal vez el Looper está en pausa o algo así. De alguna manera esto funcionó para mí y se ve así:

 activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get(); fragment.show(activity.getSupportFragmentManager(), null); activity.getSupportFragmentManager().executePendingTransactions(); fragment.getDialog(); 
  • ¿Cómo puedo usar Active Android con una base de datos en memoria para las pruebas de unidad usando Robolectric?
  • Cómo activar el registro roboeléctrico
  • Robolectric: cómo probar una SherlockActivity
  • Robolectric 3.0, no pudo probar una función que inicia un HandlerThread
  • Casos de prueba de unidad con JUnit + (Robolectric o Mockito o ambos en Android)
  • Test Robolectric ListView no se actualiza después de cambios de valor en el adaptador
  • Prueba de AsyncTaskLoaders con Robolectric
  • Robolectric inflar vistas personalizadas para pruebas
  • Agregue la información de la resolución al encargado del paquete de Robolectric
  • Prueba de vistas personalizadas con Robolectric: Ancho y altura siempre son 0
  • El RoboAttributeSet de Robolectric nunca se lee
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.