Intent Espresso adalah ekstensi untuk Espresso, yang memungkinkan validasi dan penghentian intent yang dikirim oleh aplikasi yang sedang diuji. Ini seperti Mockito, tetapi untuk Intent Android.
Jika aplikasi Anda mendelegasikan fungsi ke aplikasi atau platform lain, Anda dapat menggunakan Intent Espresso untuk berfokus pada logika aplikasi Anda sendiri sambil mengasumsikan bahwa aplikasi lain atau platform akan berfungsi dengan baik. Dengan Intent Espresso, Anda bisa mencocokkan dan memvalidasi intent keluar Anda atau bahkan memberikan respons stub sebagai pengganti respons niat yang sebenarnya.
Menyertakan Intent Espresso dalam project Anda
Di file app/build.gradle
aplikasi Anda, tambahkan baris berikut di dalamnya
dependencies
:
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Intent Espresso hanya kompatibel dengan Espresso 2.1+ dan versi 0.3+ Library pengujian Android, jadi pastikan Anda juga memperbarui baris tersebut:
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')
Menulis aturan pengujian
Sebelum menulis pengujian Intent Espresso, siapkan IntentsTestRule
. Ini adalah
ekstensi class ActivityTestRule
dan memudahkan penggunaan
API Intent Espresso dalam pengujian UI fungsional. IntentsTestRule
melakukan inisialisasi
Intent Espresso sebelum setiap pengujian yang dianotasi dengan @Test
dan rilis
Intent Espresso setelah setiap pengujian dijalankan.
Cuplikan kode berikut adalah contoh IntentsTestRule
:
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
Cocok
Intent Espresso menyediakan kemampuan untuk mencegat intent keluar berdasarkan kriteria pencocokan tertentu, yang didefinisikan menggunakan Hamcrest Matcher. Hamcrest memungkinkan Anda untuk:
- Menggunakan pencocok intent yang ada: Opsi termudah, yang harus hampir selalu lebih disukai.
- Menerapkan pencocokan intent Anda sendiri: Opsi paling fleksibel. Detail selengkapnya dapat yang tersedia di bagian berjudul "Menulis matcher kustom" dalam Tutorial Hamcrest.
Intent Espresso menawarkan intended()
dan metode intending()
untuk validasi intent dan
{i>rinting<i}. Keduanya mengambil objek Matcher<Intent>
Hamcrest sebagai
argumen.
Cuplikan kode berikut menunjukkan validasi intent yang menggunakan intent yang ada pencocok yang cocok dengan intent keluar yang memulai browser:
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");
Memvalidasi intent
Intent Espresso merekam semua intent yang mencoba meluncurkan aktivitas dari
aplikasi yang sedang diuji. Menggunakan metode intended()
, yang mirip dengan
Mockito.verify()
, Anda dapat menyatakan bahwa intent tertentu telah terlihat. Namun,
Intent Espresso tidak menghentikan respons ke intent kecuali jika Anda secara eksplisit mengonfigurasi
untuk melakukannya.
Cuplikan kode berikut adalah contoh pengujian yang memvalidasi, tetapi tidak menghentikan respons, intent keluar yang meluncurkan "ponsel" eksternal aktivitas:
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
Dengan metode intending()
, yang mirip dengan Mockito.when()
, Anda dapat
memberikan respons stub untuk aktivitas yang diluncurkan dengan
startActivityForResult()
. Hal ini sangat berguna untuk aktivitas eksternal
karena Anda tidak dapat memanipulasi antarmuka
pengguna dari aktivitas eksternal atau
mengontrol ActivityResult
yang dikembalikan ke aktivitas yang sedang diuji.
Cuplikan kode berikut menerapkan contoh
Pengujian activityResult_DisplaysContactsPhoneNumber()
, yang memverifikasi bahwa saat
pengguna meluncurkan “kontak” aktivitas di aplikasi yang sedang diuji, ponsel kontak akan
nomor ditampilkan:
Buat hasilnya agar muncul saat aktivitas tertentu diluncurkan. Tujuan contoh pengujian mencegat semua Intent yang dikirim ke "kontak" dan menghentikan respons dengan
ActivityResult
yang valid, menggunakan kode hasilRESULT_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);
Instruksikan Espresso untuk menyediakan objek hasil stub sebagai respons terhadap semua pemanggilan "kontak" intent:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
Verifikasi bahwa tindakan yang digunakan untuk meluncurkan aktivitas menghasilkan hasil stub. Dalam hal ini, contoh pengujian memeriksa apakah nomor telepon "123-345-6789" ditampilkan, dan ditampilkan saat "aktivitas kontak" diluncurkan:
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)));
Berikut adalah pengujian activityResult_DisplaysContactsPhoneNumber()
yang lengkap:
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))); }
Referensi lainnya
Untuk informasi selengkapnya tentang penggunaan Intent Espresso dalam pengujian Android, lihat referensi berikut.
Contoh
- IntentBasicSample:
Penggunaan dasar
intended()
danintending()
. - IntentAdvancedSample: Menyimulasikan pengguna yang mengambil bitmap menggunakan kamera.