Espresso-Intents ist eine Erweiterung von Espresso, mit der Validierung und Stubbing von Intents, das vom zu testenden Anwendung. Es ist wie Mockito, aber für Android Intents.
Wenn Ihre App Funktionen an andere Apps oder die Plattform delegiert, können Sie Espresso-Intents, sich auf die Logik der eigenen App zu konzentrieren und anzunehmen, dass andere Apps Andernfalls funktioniert die Plattform nicht ordnungsgemäß. Mit Espresso-Intents können Sie und validieren Sie Ihre ausgehenden Intents oder stellen Sie Stub-Antworten tatsächlichen Intent-Antworten.
Espresso-Intents in Ihr Projekt aufnehmen
Fügen Sie in der Datei app/build.gradle
Ihrer App die folgende Zeile ein:
dependencies
:
Cool
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents ist nur kompatibel mit Espresso 2.1 oder höher sowie mit Version 0.3 und höher von Aktualisieren Sie daher auch diese Zeilen:
Cool
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')
Testregeln schreiben
Bevor Sie einen Espresso-Intents-Test schreiben, richten Sie einen IntentsTestRule
ein. Dies ist ein
Erweiterung der Klasse ActivityTestRule
und vereinfacht die Nutzung
Espresso-Intents APIs in funktionalen UI-Tests Ein IntentsTestRule
wird initialisiert
Espresso-Intents vor jedem Test, die mit @Test
und Releases gekennzeichnet sind
Espresso-Intents nach jedem Testlauf.
Das folgende Code-Snippet ist ein Beispiel für ein IntentsTestRule
:
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
Übereinstimmung
Espresso-Intents bieten die Möglichkeit, ausgehende Intents basierend auf Bestimmte Kriterien, die mithilfe von Hamcrest-Matchern definiert werden, Hamcrest ermöglicht Ihnen Folgendes:
- Vorhandenen Intent-Abgleich verwenden:Das ist die einfachste Option, die fast immer sein sollte. bevorzugt werden.
- Eigenen Intent-Matcher implementieren:Dies ist die flexibelste Option. Weitere Details finden Sie finden Sie im Abschnitt „Benutzerdefinierte Matcher schreiben“. im Hamcrest-Anleitung
Espresso-Intents bietet die intended()
und intending()
-Methoden zur Intent-Validierung und
-Stubbing. Beide verwenden ein Matcher<Intent>
-Objekt von Hamcrest als
.
Das folgende Code-Snippet zeigt eine Intent-Validierung, bei der der vorhandene Intent verwendet wird Matcher, die mit einem ausgehenden Intent übereinstimmen, der einen Browser startet:
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");
Intents validieren
Espresso-Intents zeichnet alle Intents auf, mit denen versucht wird, Aktivitäten vom
zu testenden Anwendung. Mit der Methode intended()
, die der
Mockito.verify()
können Sie bestätigen, dass ein bestimmter Intent gesehen wurde. Sie können jedoch
Espresso-Intents fügt Antworten auf Intents nur hinzu, wenn Sie sie explizit konfigurieren.
damit er dies tut.
Das folgende Code-Snippet ist ein Beispieltest, der validiert, aber keinen Stub erstellt einem ausgehenden Intent, der ein externes „Smartphone“ startet, Aktivität:
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
Mit der Methode intending()
, die Mockito.when()
ähnelt, können Sie
eine Stub-Antwort für Aktivitäten bereitstellen, die mit
startActivityForResult()
Dies ist besonders nützlich für externe Aktivitäten,
da Sie weder die Benutzeroberfläche einer externen Aktivität
ActivityResult
, die an die zu testende Aktivität zurückgegeben wurden.
Die folgenden Code-Snippets implementieren ein Beispiel
activityResult_DisplaysContactsPhoneNumber()
-Test, bei dem geprüft wird,
Nutzer startet einen „Kontakt“ Aktivität in der getesteten App, die Kontakttelefonnummer
wird angezeigt:
Erstellen Sie das Ergebnis, das zurückgegeben wird, wenn eine bestimmte Aktivität gestartet wird. Die Beispieltest fängt alle an „Kontakte“ gesendeten Intents ab und stößt ihre Antworten mit einem gültigen
ActivityResult
unter Verwendung des ErgebniscodesRESULT_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);
Weisen Sie Espresso an, das Stub-Ergebnisobjekt als Antwort auf alle Aufrufe der „Kontakte“ Intent:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
Prüfen, ob die zum Starten der Aktivität verwendete Aktion das erwartete Ergebnis erzeugt Stub-Ergebnis zurückgegeben. In diesem Fall wird im Beispieltest geprüft, "123-345-6789" wird zurückgegeben und angezeigt, wenn die „Kontaktaktivität“ wird eingeführt:
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)));
Hier ist der vollständige activityResult_DisplaysContactsPhoneNumber()
-Test:
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))); }
Weitere Informationen
Weitere Informationen zur Verwendung von Espresso-Intents in Android-Tests finden Sie unter in den folgenden Ressourcen.
Produktproben
- IntentsBasicSample:
Grundlegende Verwendung von
intended()
undintending()
. - IntentsAdvancedSample: Simuliert einen Nutzer, der mit der Kamera eine Bitmap abruft.