2017-07-11 2 views

Répondre

2

Si vous utilisez le ActivityTestRule, que diriez-vous de quelque chose comme ceci?

Intents.init(); 
Intent intent = // Build your intent 

rule.launchActivity(intent); 

// Assertions  

Intents.release() 

Je ne suis pas réellement un utilisateur Espresso, mais je suppose que va lancer votre activité et onNewIntent() sera appelée. Puis faites vos affirmations.

Remarque: ceci utilise la bibliothèque Espresso Intents, conçue à cet effet.
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2'

+0

Merci, cela fonctionne bien mais me montre une erreur: impossible de lancer l'intention intentionnelle dans les 45 secondes. Peut-être que le fil principal n'est pas resté inactif dans un laps de temps raisonnable? –

+0

Espresso Intents a été conçu pour traiter les intentions envoyées ** out ** par l'application testée. Il n'y a pas besoin de l'utiliser ici. Vous pouvez le lire dans le [intro] (https://developer.android.com/training/testing/espresso/intents.html) –

1

La méthode onNewIntent() est public, de sorte que vous pouvez appeler directement:

activityTestRule.getActivity().onNewIntent(new Intent()) 

Cela fonctionne réellement, mais ce n'est pas trop bon parce que vous appelez la méthode du fil d'application de test. Si l'appel onNewIntent() provoque des modifications sur l'interface utilisateur, vous obtiendrez une exception car seul le thread qui a créé la vue peut le modifier. Pour corriger cela, vous pouvez forcer l'exécution sur le thread d'interface utilisateur

activityTestRule.getActivity().runOnUiThread(() -> { 
    activityTestRule.getActivity().onNewIntent(new Intent())); 
}); 

Cela vous permettra de tester la méthode onNewIntent() de votre activité. Par la façon dont vous avez formulé votre question, vous voulez également vérifier un comportement de l'activité étant défini comme singleTop. Au lieu d'appeler la méthode directement, vous pouvez démarrer une activité qui devrait effectivement déclencher onNewIntent() dans l'activité en cours de test:

Intent intent = new Intent(activityTestRule.getActivity().getApplicationContext(), ActivityUnderTest.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

InstrumentationRegistry.getTargetContext().startActivity(intent)); 

Cela devrait finir par appeler onNewIntent() de l'activité à l'essai tant qu'il est défini comme singleTop, sinon il va démarrer une nouvelle instance d'activité.