Espresso-Intents est une extension d'Espresso, qui permet la validation et bouchons d'intents envoyés par application testée. C'est comme <ph type="x-smartling-placeholder"></ph> Mockito, mais pour les intents Android.
Si votre application délègue des fonctionnalités à d'autres applications ou à la plate-forme, vous pouvez utiliser les intents Espresso pour se concentrer sur la logique de votre propre application tout en supposant que d'autres applications ou la plateforme fonctionnera correctement. Avec Espresso-Intents, vous pouvez faire correspondre et valider vos intents sortants, ou même fournir des réponses bouchons à la place des réponses d'intent réelles.
Inclure Espresso-Intents dans votre projet
Dans le fichier app/build.gradle
de votre application, ajoutez la ligne suivante à l'intérieur
dependencies
:
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents n'est compatible qu'avec Espresso 2.1 ou version ultérieure et avec les versions 0.3 et ultérieures de Les bibliothèques de test Android doivent donc également être mises à jour:
Groovy
androidTestImplementation 'androidx.test:runner:1.6.1' androidTestImplementation 'androidx.test:rules:1.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
Kotlin
androidTestImplementation('androidx.test:runner:1.6.1') androidTestImplementation('androidx.test:rules:1.6.1') androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
Écrire des règles de test
Avant d'écrire un test Espresso-Intents, configurez un IntentsTestRule
. Il s'agit d'un
extension de la classe ActivityTestRule
et facilite son utilisation
API Espresso-Intents dans les tests fonctionnels de l'interface utilisateur. Un IntentsTestRule
s'initialise.
Espresso-Intents avant chaque test annoté avec @Test
et des versions.
Espresso-Intents après chaque exécution de test.
L'extrait de code suivant est un exemple de IntentsTestRule
:
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
Correspondance
Espresso-Intents permet d'intercepter les intents sortants en fonction certains critères de correspondance, qui sont définis à l'aide de la fonction de mise en correspondance de Hamcrest. Hamcrest vous permet de:
- Utiliser un outil de mise en correspondance des intents existant:option la plus simple, qui devrait presque toujours à privilégier.
- Implémenter votre propre outil de mise en correspondance des intents:option la plus flexible. Vous trouverez plus d'informations disponible dans la section intitulée "Écrire des outils de mise en correspondance personnalisés". dans la Tutoriel sur Hamcrest.
Espresso-Intents propose le intended()
et intending()
pour la validation des intents et
le bouchon, respectivement. Les deux prennent un objet Matcher<Intent>
Hamcrest comme
.
L'extrait de code suivant montre une validation d'intent qui utilise un intent existant outils de mise en correspondance qui correspondent à un intent sortant qui lance un navigateur:
Kotlin
assertThat(intent).hasAction(Intent.ACTION_VIEW) assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE) assertThat(intent).hasData(Uri.parse("www.google.com")) assertThat(intent).extras().containsKey("key1") assertThat(intent).extras().string("key1").isEqualTo("value1") assertThat(intent).extras().containsKey("key2") assertThat(intent).extras().string("key2").isEqualTo("value2")
Java
assertThat(intent).hasAction(Intent.ACTION_VIEW); assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE); assertThat(intent).hasData(Uri.parse("www.google.com")); assertThat(intent).extras().containsKey("key1"); assertThat(intent).extras().string("key1").isEqualTo("value1"); assertThat(intent).extras().containsKey("key2"); assertThat(intent).extras().string("key2").isEqualTo("value2");
Valider les intents
Espresso-Intents enregistre tous les intents qui tentent de lancer des activités à partir de
application testée. Utiliser la méthode intended()
, qui est semblable à
Mockito.verify()
, vous pouvez affirmer qu'un intent donné a été vu. Toutefois,
Espresso-Intents ne bouchon pas les réponses aux intents, sauf si vous configurez explicitement
pour ce faire.
L'extrait de code suivant est un exemple de test de validation, sans bouchon des réponses, un intent sortant qui lance un "téléphone" externe activité:
Kotlin
@Test fun validateIntentSentToPackage() { // User action that results in an external "phone" activity being launched. user.clickOnView(system.getView(R.id.callButton)) // Using a canned RecordedIntentMatcher to validate that an intent resolving // to the "phone" activity has been sent. intended(toPackage("com.android.phone")) }
Java
@Test public void validateIntentSentToPackage() { // User action that results in an external "phone" activity being launched. user.clickOnView(system.getView(R.id.callButton)); // Using a canned RecordedIntentMatcher to validate that an intent resolving // to the "phone" activity has been sent. intended(toPackage("com.android.phone")); }
Stubbing
À l'aide de la méthode intending()
, qui est semblable à Mockito.when()
, vous pouvez
fournir une réponse bouchon pour les activités lancées avec
startActivityForResult()
C'est particulièrement utile pour les activités externes
car vous ne pouvez pas manipuler
l'interface utilisateur d'une activité externe ni
contrôler le ActivityResult
renvoyé à l'activité testée.
Les extraits de code suivants implémentent un exemple
activityResult_DisplaysContactsPhoneNumber()
, qui vérifie que lorsqu'un
l'utilisateur lance un "contact" dans l'application testée, le numéro de téléphone du contact
s'affiche:
Créez le résultat à renvoyer lorsqu'une activité particulière est lancée. La l'exemple de test intercepte tous les intents envoyés à "contacts" et élabore des bouchons des réponses avec un
ActivityResult
valide, en utilisant le code de résultatRESULT_OK
Kotlin
val resultData = Intent() val phoneNumber = "123-345-6789" resultData.putExtra("phone", phoneNumber) val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
Java
Intent resultData = new Intent(); String phoneNumber = "123-345-6789"; resultData.putExtra("phone", phoneNumber); ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData);
Demandez à Espresso de fournir l'objet de résultat du bouchon en réponse à toutes les appels des "contacts" intent:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
Vérifier que l'action utilisée pour lancer l'activité produit l'image attendue résultat du bouchon. Dans ce cas, l'exemple de test vérifie que le numéro de téléphone "123-345-6789" est renvoyé et lorsque l'activité liée aux contacts est lancé:
Kotlin
onView(withId(R.id.pickButton)).perform(click()) onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
Java
onView(withId(R.id.pickButton)).perform(click()); onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
Voici le test activityResult_DisplaysContactsPhoneNumber()
complet:
Kotlin
@Test fun activityResult_DisplaysContactsPhoneNumber() { // Build the result to return when the activity is launched. val resultData = Intent() val phoneNumber = "123-345-6789" resultData.putExtra("phone", phoneNumber) val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData) // Set up result stubbing when an intent sent to "contacts" is seen. intending(toPackage("com.android.contacts")).respondWith(result) // User action that results in "contacts" activity being launched. // Launching activity expects phoneNumber to be returned and displayed. onView(withId(R.id.pickButton)).perform(click()) // Assert that the data we set up above is shown. onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber))) }
Java
@Test public void activityResult_DisplaysContactsPhoneNumber() { // Build the result to return when the activity is launched. Intent resultData = new Intent(); String phoneNumber = "123-345-6789"; resultData.putExtra("phone", phoneNumber); ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData); // Set up result stubbing when an intent sent to "contacts" is seen. intending(toPackage("com.android.contacts")).respondWith(result); // User action that results in "contacts" activity being launched. // Launching activity expects phoneNumber to be returned and displayed. onView(withId(R.id.pickButton)).perform(click()); // Assert that the data we set up above is shown. onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber))); }
Ressources supplémentaires
Pour en savoir plus sur l'utilisation d'Espresso-Intents dans les tests Android, consultez les ressources suivantes.
Exemples
- IntentsBasicSample:
Utilisation de base de
intended()
etintending()
. - IntentsAdvancedSample: Simule la récupération d'un bitmap par un utilisateur à l'aide de l'appareil photo.