web-dev-qa-db-fra.com

Comment puis-je tester des fragments avec Robolectric?

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.

56
kaneda

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();
    }
}
105
colabug

Vous faites tous ça à la dure. Il suffit d'utiliser FragmentTestUtil.

FragmentTestUtil.startFragment(yourfragment);
36
Brian Griffey

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:

  • github changelog , déplacement de fragments de support vers différents modules
13
Baker

Je suis à peu près sûr que vous devez créer une FragmentTransaction à l'aide de la FragmentManager, alors cela fonctionnera.

2
Christopher Perry

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();
2
superjugy
SupportFragmentTestUtil.startFragment(fragment, AppCompatActivity::class.Java)

Si l'activité est en extension AppCompatActivity

Ceci utilise Kotlin

0
prijupaul