Espresso-Absichten

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:

  1. 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 Ergebniscodes 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. 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);
    
  3. 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