2017-05-29 1 views
1

Je veux obtenir une référence à mon activité avant qu'elle ne soit créée afin d'injecter quelques faux-semblants.Comment se moquer des dépendances d'activité dans un test d'instrumentation

J'ai donc ma règle de test d'activité comme:

ActivityTestRule mActivityRule = new ActivityTestRule<MainActivity>(MainActivity,class, true, false) 

Je sais que ActivityTestRule a un rappel beforeActivityLaunched, mais je ne peux pas obtenir toute référence à mon activité (est là nulle).

Donc, si je fais:

@Rule 
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule(
     MainActivity.class) { 
    @Override 
    protected void beforeActivityLaunched() { 
     super.beforeActivityLaunched(); 
     MainActivity act = (MainActivity)getActivity(); 
     //Here act is null 

Je ne peux pas obtenir une référence à mon activité dans la méthode setUp de ma classe de test soit. La référence d'activité est prête uniquement lorsque je fais rule.launchActivity(), mais que l'activité est exécutée et que je ne peux transmettre aucune dépendance auparavant. Je sais que je peux utiliser un poignard pour ça, mais je veux l'éviter pour ce cas. Existe-t-il un moyen de préparer les dépendances d'activité sans poignard avant son lancement?

+0

Ceci est une bonne question, car il est exactement ce modèle qui est nécessaire lors de l'utilisation de l'espresso Idling Ressources qui sont acquises et libérées par une activité ayant pourtant les registres IdlingRegistry() et unregister() appelés par la ActivityRule. Dans mon cas, les méthodes du cycle de vie de l'activité interagissaient avec la ressource Idling (conditionnellement sur la ressource n'étant pas nulle) et j'espérais définir la ressource avant les transitions du cycle de vie. En fin de compte, j'ai dû redessiner l'activité pour l'adapter au modèle de test ... –

Répondre

0

Si le second paramètre (launchActivity) est faux dans ActivityTestRule cela signifie que vous devez personnaliser l'intention par méthode d'essai

@Test 
public void dummyTest() { 
    mActivityRule.launchActivity(new Intent()); 
// code here 
}