Intent Espresso

Intent Espresso adalah ekstensi untuk Espresso yang memungkinkan validasi dan penghentian intent yang dikirim oleh aplikasi yang sedang diuji. Intent Espresso mirip dengan Mockito, tetapi untuk Intent Android.

Jika aplikasi Anda mendelegasikan fungsionalitas ke aplikasi lain atau platform, Anda dapat menggunakan Intent Espresso untuk fokus pada logika aplikasi Anda sendiri sambil mengasumsikan bahwa aplikasi atau platform lain akan berfungsi dengan benar. Dengan Intent Espresso, Anda dapat mencocokkan dan memvalidasi intent keluar Anda atau bahkan memberikan respons stub sebagai pengganti respons intent yang sebenarnya.

Menyertakan Intent Espresso dalam project Anda

Di file app/build.gradle, tambahkan baris berikut di dalam dependencies:

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
    

Intent Espresso hanya kompatibel dengan Espresso 2.1+ dan versi 0.3+ dari library pengujian Android, jadi pastikan Anda mengupdate baris-baris tersebut juga:

androidTestImplementation 'androidx.test:runner:1.1.0'
    androidTestImplementation 'androidx.test:rules:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
    

Menulis aturan pengujian

Sebelum menulis pengujian Intent Espresso, siapkan IntentsTestRule. Kode tersebut adalah ekstensi dari class ActivityTestRule dan memudahkan penggunaan Espresso-Intents API dalam pengujian UI fungsional. IntentsTestRule menginisialisasi Intent Espresso sebelum setiap pengujian yang dianotasi dengan @Test dan melepaskan 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);
    

Kecocokan

Intent Espresso menyediakan kemampuan untuk mencegat intent keluar berdasarkan kriteria pencocokan tertentu, yang didefinisikan menggunakan Hamcrest Matcher. Hamcrest memungkinkan Anda untuk:

  • Menggunakan matcher intent yang ada: Opsi termudah, yang hampir selalu digunakan.
  • Menerapkan pencocokan intent Anda sendiri: Opsi paling fleksibel. Detail selengkapnya tersedia di bagian yang berjudul "Menulis matcher kustom" dalam tutorial Hamcrest.

Intent Espresso menawarkan metode intended() dan intending() untuk validasi dan penghentian intent masing-masing. Keduanya mengambil objek Matcher<Intent> Hamcrest sebagai argumen.

Cuplikan kode berikut ini menunjukkan validasi intent menggunakan pencocokan intent yang tersedia serta 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. Dengan menggunakan metode intended(), yang mirip dengan Mockito.verify(), Anda dapat menegaskan bahwa intent yang diberikan telah terlihat. Namun, Intent Espresso tidak menghentikan respons ke intent kecuali jika Anda secara eksplisit mengonfigurasi Intent Espresso untuk melakukannya.

Cuplikan kode berikut adalah contoh pengujian yang memvalidasi, tetapi tidak menghentikan respons ke intent keluar yang meluncurkan aktivitas eksternal "telepon":

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"));
    }
    

Stub

Menggunakan metode intending(), yang mirip dengan Mockito.when(), Anda dapat memberikan respons stub untuk aktivitas yang diluncurkan dengan startActivityForResult(). Hal tersebut 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 aktivitas "kontak" di aplikasi yang sedang diuji, nomor telepon kontak akan ditampilkan:

  1. Buat hasilnya agar muncul saat aktivitas tertentu diluncurkan. Contoh pengujian berikut mencegat semua Intent yang dikirim ke "kontak" dan menghentikan responsnya dengan ActivityResult yang valid dengan menggunakan kode hasil 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. Instruksikan Espresso untuk memberikan objek hasil stub sebagai respons terhadap semua pemanggilan intent "kontak":

    Kotlin

        intending(toPackage("com.android.contacts")).respondWith(result)
        

    Java

        intending(toPackage("com.android.contacts")).respondWith(result);
        
  3. Verifikasi bahwa tindakan yang digunakan untuk meluncurkan aktivitas menghasilkan hasil stub yang diharapkan. Dalam kasus ini, pengujian contoh memeriksa bahwa nomor telepon "123-345-6789" dikembalikan 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 ini 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