Je sais qu’il existe une méthode Robolectric.shadowOf(Fragment)
et une classe ShadowFragment
, pensant qu’elles ne figurent pas dans la documentation, mais je ne peux pas le faire fonctionner.
myFragment = new MyFragment();
myFragment.onCreateView(LayoutInflater.from(activity), (ViewGroup) activity.findViewById(R.id.container), null);
myFragment.onAttach(activity);
myFragment.onActivityCreated(null);
Je travaille avec API niveau 13 (Honeycomb).
Merci.
Edit # 4 & # 5: In Robolectric 3. * , ils séparent les fonctions de départ des fragments.
Pour les fragments de support, vous devrez ajouter une dependency à votre build.gradle
:
testCompile "org.robolectric:shadows-supportv4:3.8"
Importer: org.robolectric.shadows.support.v4.SupportFragmentTestUtil.startFragment;
Pour les fragments de plate-forme, vous n'avez pas besoin de cette dépendance. Importer: import static org.robolectric.util.FragmentTestUtil.startFragment;
Ils utilisent tous deux le même nom 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 );
}
}
Edit # 3: Robolectric 2.4 a une API pour le support et des fragments réguliers . Vous pouvez utiliser le modèle newInstance()
ou le constructeur lors de la construction de vos Fragment
's.
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 );
}
}
Edit # 2: Il existe un nouvel assistant si vous utilisez des fragments de support ( celui qui prend en charge les activités régulières/les fragments devrait figurer dans la prochaine version ):
import static org.robolectric.util.FragmentTestUtil.startFragment;
@Before
public void setUp() throws Exception
{
fragment = YourFragment.newInstance();
startFragment( fragment );
}
Edit: Si vous avez mis à niveau vers 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();
}
Réponse originale
Comme l’a suggéré l’autre intervenant, vous devez utiliser le gestionnaire de fragments (au lieu d’appeler les méthodes de cycle de vie répertoriées ci-dessus).
@RunWith(MyTestRunner.class)
public class YourFragmentTest
{
@Test
public void shouldNotBeNull() throws Exception
{
YourFragment yourFragment = new YourFragment();
startFragment( yourFragment );
assertNotNull( yourFragment );
}
Je crée un testeur et une fonction qui démarre un fragment pour que je puisse l'utiliser partout.
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();
}
}
Vous faites tous ça à la dure. Il suffit d'utiliser FragmentTestUtil.
FragmentTestUtil.startFragment(yourfragment);
Les fragments de support ont été déplacés vers le module:
ombres-support-v4
(à partir de juillet 2015, Robolectric v3.0)
Ajoutez une dépendance de niveau à app/build.gradle:
testCompile 'org.robolectric:shadows-support-v4:3.0'
Importez ensuite dans votre classe Java de test Robolectric:
import org.robolectric.shadows.support.v4.SupportFragmentTestUtil;
Ensuite, vous pouvez démarrer et utiliser un fragment de support-v4 pour les tests:
@Test
public void minimalFragmentTest() throws Exception {
MyFunFragment fragment = new MyFunFragment();
SupportFragmentTestUtil.startVisibleFragment(fragment);
assertThat(fragment.getView()).isNotNull();
}
Références:
Je suis à peu près sûr que vous devez créer une FragmentTransaction
à l'aide de la FragmentManager
, alors cela fonctionnera.
Je voulais juste ajouter cela dans Robolectric 2.0 même après avoir fait:
activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragment.show(activity.getSupportFragmentManager(), null);
fragment.getDialog(); //This stills returns null
Il est toujours revenu nul pour moi. ce que j'ai fait a été d'ajouter activity.getSupportFragmentManager().executePendingTransaction();
et cela a fonctionné.
Il semble que Robolectric ne fonctionne pas pour une raison quelconque. il semble que le Looper est peut-être en pause ou quelque chose. de toute façon cela a fonctionné pour moi et cela ressemble à ceci:
activity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragment.show(activity.getSupportFragmentManager(), null);
activity.getSupportFragmentManager().executePendingTransactions();
fragment.getDialog();
SupportFragmentTestUtil.startFragment(fragment, AppCompatActivity::class.Java)
Si l'activité est en extension AppCompatActivity
Ceci utilise Kotlin