Espresso-Intents è un'estensione di Espresso, che consente la convalida stubbing di intent inviati dell'applicazione in fase di test. È simile a Mockito, ma per Android Intent.
Se la tua app delega la funzionalità ad altre app o alla piattaforma, puoi usare Gli Espresso-Intent si concentrano sulla logica della tua app, supponendo che altre app o la piattaforma funzionerà correttamente. Con Espresso-Intents, potete abbinare e convalidare gli intenti in uscita o persino fornire risposte stub al posto e in risposta all'intenzione effettiva.
Includi Espresso-Intent nel progetto
Nel file app/build.gradle
dell'app, aggiungi la seguente riga all'interno
dependencies
:
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents è compatibile solo con Espresso 2.1+ e versione 0.3+ di librerie di test di Android, quindi assicurati di aggiornare anche queste righe:
androidTestImplementation 'androidx.test:runner:1.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation('androidx.test:runner:1.6.1')
androidTestImplementation('androidx.test:rules:1.6.1')
androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
Scrivi regole di test
Prima di scrivere un test Espresso-Intents, configura un IntentsTestRule
. Si tratta di un
dell'estensione ActivityTestRule
e semplifica l'uso
API Espresso-Intents nei test funzionali dell'interfaccia utente. Un elemento IntentsTestRule
viene inizializzato
Espresso-Intent prima di ogni test annotati con @Test
e release
Espresso-Intent dopo ogni esecuzione di test.
Il seguente snippet di codice è un esempio di IntentsTestRule
:
@get:Rule
val intentsTestRule = IntentsTestRule(MyActivity::class.java)
@Rule
public IntentsTestRule<MyActivity> intentsTestRule =
new IntentsTestRule<>(MyActivity.class);
Corrispondenza
Espresso-Intents consente di intercettare gli intent in uscita in base determinati criteri di corrispondenza, che vengono definiti con il matcher Hamcrest. Hamcrest ti consente di:
- Utilizzare uno strumento di abbinamento di intent esistente:l'opzione più semplice, che dovrebbe quasi sempre da preferire.
- Implementa il tuo matcher per intent: l'opzione più flessibile. Ulteriori dettagli sono disponibili nella sezione "Scrittura di matcher personalizzati" all'interno Tutorial di Harcrest.
Espresso-Intents offre la intended()
e intending()
per la convalida dell'intento e
stubbing. Entrambi prendono un oggetto Hamcrest Matcher<Intent>
come
.
Il seguente snippet di codice mostra la convalida dell'intent che utilizza l'intent esistente matcher che corrispondono a un intent in uscita che avvia un browser:
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")
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");
Convalida gli intent
Espresso-Intents registra tutti gli intent che tentano di avviare attività dal
dell'applicazione in fase di test. Se utilizzi il metodo intended()
, simile a
Mockito.verify()
, puoi affermare che un determinato intento è stato visto. Tuttavia,
Espresso-Intents non crea errori di risposta agli intent a meno che non configuri esplicitamente
per farlo.
Il seguente snippet di codice è un test di esempio che esegue la convalida, ma non crea le risposte, un intent in uscita che lancia un "telefono" esterno attività:
@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"))
}
@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"));
}
Stubaggio
Con il metodo intending()
, simile a Mockito.when()
, puoi
forniscono una risposta stub per le attività avviate con
startActivityForResult()
. Ciò è particolarmente utile per le attività esterne
perché non puoi manipolare l'interfaccia utente di un'attività esterna,
controlla ActivityResult
restituito all'attività oggetto del test.
I seguenti snippet di codice implementano un esempio
activityResult_DisplaysContactsPhoneNumber()
, che verifica che, quando un
l'utente avvia un "contatto" attività nell'app sottoposta a test, il telefono di contatto
numero visualizzato:
Crea il risultato da restituire quando viene avviata una determinata attività. La il test di esempio intercetta tutti gli intent inviati ai "contatti" e analizza i loro risposte con un valore
ActivityResult
valido, utilizzando il codice risultatoRESULT_OK
val resultData = Intent()
val phoneNumber = "123-345-6789"
resultData.putExtra("phone", phoneNumber)
val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)Intent resultData = new Intent();
String phoneNumber = "123-345-6789";
resultData.putExtra("phone", phoneNumber);
ActivityResult result =
new ActivityResult(Activity.RESULT_OK, resultData);Spiega a Espresso di fornire l'oggetto stub result in risposta a tutte chiamate "contatti" intent:
Verifica che l'azione utilizzata per avviare l'attività produca i risultati previsti stub. In questo caso, il test di esempio controlla che il numero di telefono "123-345-6789" viene restituito e visualizzato quando l'"attività dei contatti" viene lanciato:
Ecco il test completo di activityResult_DisplaysContactsPhoneNumber()
:
@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)))
}
@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)));
}
Risorse aggiuntive
Per ulteriori informazioni sull'uso di Espresso-Intents nei test Android, consulta le seguenti risorse.
Campioni
- IntentsBasicSample:
Utilizzo di base di
intended()
eintending()
. - IntentsAdvancedSample: Simula un utente che recupera una bitmap utilizzando la fotocamera.