Espresso-Intents, test edilen uygulama tarafından gönderilen intentlerin doğrulanmasını ve saptırılmasını sağlayan bir Espresso uzantısıdır. Mockito'ya benzer, ancak Android Intent'leri içindir.
Uygulamanız işlevler için başka uygulamalara veya platforma yetki verirse diğer uygulamaların veya platformun düzgün çalışacağını varsayarak kendi uygulamanızın mantığına odaklanmak için Espresso-Intents'i kullanabilirsiniz. Espresso-Intents ile giden amaçlarınızı eşleştirip doğrulayabilir ve hatta gerçek amaç yanıtları yerine kaba yanıtlar sağlayabilirsiniz.
Projenize Espresso-Intent'leri dahil edin
Uygulamanızın app/build.gradle
dosyasının dependencies
içine aşağıdaki satırı ekleyin:
Modern
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents yalnızca Espresso 2.1+ ve Android test kitaplıklarının 0.3 ve üstü sürümleriyle uyumludur. Bu nedenle bu satırları da güncellediğinizden emin olun:
Modern
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')
Test kurallarını yaz
Espresso-Intents testi yazmadan önce IntentsTestRule
oluşturun. Bu, ActivityTestRule
sınıfının bir uzantısıdır ve işlevsel kullanıcı arayüzü testlerinde Espresso-Intents API'lerinin kullanımını kolaylaştırır. IntentsTestRule
, her testten önce @Test
ek açıklamasıyla Espresso-Intents'i başlatır ve her test çalıştırmasından sonra Espresso-Intents'i yayınlar.
Aşağıdaki kod snippet'i, IntentsTestRule
örneğidir:
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
Eşleşme
Espresso-Intents, Hamcrest Eşleştiriciler kullanılarak tanımlanan belirli eşleşme ölçütlerine göre giden niyetlere müdahale etme olanağı sağlar. Hamcrest aşağıdakileri yapmanıza olanak tanır:
- Mevcut bir intent eşleyiciyi kullanma: Neredeyse her zaman tercih edilmesi gereken en kolay seçenektir.
- Kendi amaç eşleştiricinizi uygulama: En esnek seçenektir. Hamcrest eğitimindeki "Özel eşleyiciler yazma" başlıklı bölümde daha fazla ayrıntı bulabilirsiniz.
Espresso-Intents, intent doğrulama ve saplama için sırasıyla intended()
ve intending()
yöntemlerini sunar. Her ikisi de bağımsız değişken olarak bir Hamcrest Matcher<Intent>
nesnesini alır.
Aşağıdaki kod snippet'i, tarayıcı başlatan bir giden intent ile eşleşen mevcut intent eşleyicileri kullanan amaç doğrulamasını göstermektedir:
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");
Amaçları doğrulayın
Espresso-Intents, test edilen uygulamadan etkinlik başlatmaya çalışan tüm amaçları kaydeder. Mockito.verify()
benzeri intended()
yöntemini kullanarak belirli bir amacın görüldüğünü doğrulayabilirsiniz. Ancak Espresso-Intents, bunu yapacak şekilde açıkça yapılandırmadığınız sürece niyetlere verilen yanıtları saptırmaz.
Aşağıdaki kod snippet'i, harici bir "telefon" etkinliği başlatan giden bir intent olan yanıtları doğrulayan ancak saptırmayan örnek bir testtir:
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")); }
Saplama
Mockito.when()
ile benzer olan intending()
yöntemini kullanarak startActivityForResult()
ile başlatılan etkinliklere kod yanıtı sağlayabilirsiniz. Bu, harici bir etkinliğin kullanıcı arayüzünü değiştiremeyeceğiniz veya test edilen etkinliğe döndürülen ActivityResult
öğesini kontrol edemediğiniz için özellikle harici etkinlikler için kullanışlıdır.
Aşağıdaki kod snippet'lerinde, kullanıcı test edilen uygulamada "kişi" etkinliği başlattığında iletişim için kullanılacak telefon numarasının gösterildiğini doğrulayan bir örnek activityResult_DisplaysContactsPhoneNumber()
testi kullanılmaktadır:
Sonucu belirli bir etkinlik başlatıldığında döndürülecek şekilde oluşturun. Örnek test, "kişiler"e gönderilen tüm Intent'leri engeller ve sonuç kodunu kullanarak yanıtlarını geçerli bir
ActivityResult
ile saptırırRESULT_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);
Espresso'ya, "contacts" amacının tüm çağrılarına yanıt olarak sap sonuç nesnesini sağlaması talimatını verin:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
Etkinliği başlatmak için kullanılan işlemin beklenen saplama sonucunu ürettiğini doğrulayın. Bu durumda, örnek test, "kişiler etkinliği" başlatıldığında "123-345-6789" telefon numarasının döndürülüp döndürülmediğini ve görüntülenip görüntülenmediğini kontrol eder:
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)));
activityResult_DisplaysContactsPhoneNumber()
testinin tamamı aşağıda verilmiştir:
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))); }
Ek kaynaklar
Android testlerinde Espresso-Intents'i kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara başvurun.
Sana Özel
- IntentsBasicSample:
intended()
veintending()
'in temel kullanımı. - IntentsAdvancedSample: Kamerayı kullanarak bit eşlem getiren bir kullanıcıyı simüle eder.