¿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).
- Puede (debe) robolectric utilizarse para probar el filtro de intención
- Robolectric: probar un ListView con el patrón ViewHolder causa NullPointerException
- Robolectric buildActivity () con espía Mockito?
- Problema con Robolectric con la nueva versión de los servicios de Google Play
- Robolectric Run
Gracias.
- Cómo calcular la cobertura de la prueba con Robolectric
- ¿Cómo puedo sombrear el PackageManager con Robolectric
- ¿Cómo puedo burlarme del contexto usando Mockito y Robolectric?
- ¿Cómo puedo detectar con Robolectric que onBackPressed se llama programáticamente?
- Pruebas con Robolectric y ANT
- Robolectric + Eclipse ¿No encuentra recursos?
- Error al usar Robolectric para probar un ActionBarActivity
- Robolectric 2.1 y Eclipse
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();
- Optimizar el cajón y la velocidad de lanzamiento de la actividad
- ¿Cómo obtener el último registro de Sqlite?