Intents d'Espresso

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:

  1. 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ésultat RESULT_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);
    
  2. 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);
    
  3. 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