Espresso-Intents
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
Espresso-Intents は Espresso の拡張機能であり、テスト対象のアプリから送信されるインテントの検証とスタブ化をサポートします。
Mockito に似ていますが、Android のインテントを対象としています。
テスト対象のアプリが他のアプリまたはプラットフォームに機能を委任している場合、Espresso-Intents を使用することにより、他のアプリまたはプラットフォームが正しく機能していると仮定して、対象アプリのロジックのテストに専念できます。Espresso-Intents を使用すれば、送信されるインテントのマッチングや検証を行えるうえ、実際のインテント レスポンスの代わりにスタブ レスポンスを使うこともできます。
プロジェクトへの Espresso-Intents の組み込み
アプリの app/build.gradle
ファイルで、dependencies
に次の行を追加します。
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents は、Espresso 2.1 以上および Android テスト ライブラリのバージョン 0.3 以上のみと互換性があるため、次の行も必ず更新してください。
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')
テストルールの作成
Espresso-Intents テストを作成する前に、IntentsTestRule
をセットアップします。これは ActivityTestRule
の拡張クラスであり、UI の機能テストで Espresso-Intents の API を簡単に使用できるようにします。IntentsTestRule
は、@Test
アノテーションが付けられた個々のテストの前に Espresso-Intents を初期化し、テストの実施後に Espresso-Intents を解放します。
次のコード スニペットは、IntentsTestRule
の例を示しています。
Kotlin
@get:Rule
val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule
public IntentsTestRule<MyActivity> intentsTestRule =
new IntentsTestRule<>(MyActivity.class);
一致
Espresso-Intents には、Hamcrest マッチャーで定義したマッチング基準に基づいて、送信されるインテントをインターセプトする機能が用意されています。Hamcrest により次のことが可能になります。
- 既存のインテント マッチャーの使用: 最も簡単なオプションであり、ほとんどの場合に推奨されます。
- 独自のインテント マッチャーの実装: 最も自由度の高いオプションです。詳細については、Hamcrest チュートリアルの「カスタム マッチャーの作成」セクションをご覧ください。
Espresso-Intents には、インテントの検証とスタブ化のために、それぞれ intended()
メソッドと intending()
メソッドが用意されています。どちらのメソッドも Hamcrest Matcher<Intent>
オブジェクトを引数として受け取ります。
次のコード スニペットは、既存のインテント マッチャーを使用したインテント検証の例を示しています。このマッチャーは、ブラウザを起動する発信インテントのマッチングを行います。
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");
インテントの検証
Espresso-Intents は、テスト対象のアプリからアクティビティを起動しようとするすべてのインテントを記録します。Mockito.verify()
に似た intended()
メソッドを使用すると、特定のインテントが確認されたかどうかをアサーションできます。その一方で、Espresso-Intents は、明示的に構成しない限り、インテントへのレスポンスをスタブ化しません。
次のコード スニペットは、外部の「電話」アクティビティを起動する発信インテントについて、検証はするもののレスポンスのスタブ化は行わないテストの例です。
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"));
}
スタブ化
Mockito.when()
に似た intending()
メソッドを使用すると、startActivityForResult()
で起動するアクティビティに対してスタブ レスポンスを提供できます。これは、外部アクティビティに対して特に有効です。外部アクティビティについては、そのユーザー インターフェースを操作したり、テスト対象のアクティビティに返される ActivityResult
を制御したりすることができないからです。
次のコード スニペットは、activityResult_DisplaysContactsPhoneNumber()
のサンプルテストを実装します。このテストでは、ユーザーがテスト対象アプリで「連絡先」アクティビティを起動したときに、連絡先の電話番号が表示されることを確認します。
特定のアクティビティが起動された際に返す結果を準備します。このサンプルテストでは、「連絡先」に送信されるすべてのインテントをインターセプトし、結果コード RESULT_OK
を使用して、有効な ActivityResult
を含むレスポンスをスタブ化します。
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 に指示します。
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
アクティビティの起動に使用するアクションによって期待するスタブ結果が生成されることを確認します。このサンプルテストでは、「連絡先アクティビティ」が起動されたときに、電話番号「123-345-6789」が返され、表示されることを確認しています。
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()
のテスト全体を次に示します。
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)));
}
参考情報
Espresso-Intents を使用した Android のテストに関するその他の情報については、次のリソースをご覧ください。
サンプル
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-08-08 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-08-08 UTC。"],[],[],null,["# Espresso-Intents is an extension to Espresso, which enables validation and\nstubbing of [intents](/reference/android/content/Intent) sent out by the\napplication under test. It's like [Mockito](http://site.mockito.org), but for Android Intents.\n\nIf your app delegates functionality to other apps or the platform, you can use\nEspresso-Intents to focus on your own app's logic while assuming that other apps\nor the platform will function correctly. With Espresso-Intents, you can match\nand validate your outgoing intents or even provide stub responses in place of\nactual intent responses.\n\nInclude Espresso-Intents in your project\n----------------------------------------\n\nIn your app's `app/build.gradle` file, add the following line inside\n`dependencies`: \n\n### Groovy\n\n```groovy\nandroidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'\n```\n\n### Kotlin\n\n```kotlin\nandroidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')\n```\n\nEspresso-Intents is only compatible with Espresso 2.1+ and version 0.3+ of\nAndroid testing libraries, so make sure you update those lines as well: \n\n### Groovy\n\n```groovy\nandroidTestImplementation 'androidx.test:runner:1.6.1'\nandroidTestImplementation 'androidx.test:rules:1.6.1'\nandroidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'\n```\n\n### Kotlin\n\n```kotlin\nandroidTestImplementation('androidx.test:runner:1.6.1')\nandroidTestImplementation('androidx.test:rules:1.6.1')\nandroidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')\n```\n\nWrite test rules\n----------------\n\nBefore writing an Espresso-Intents test, set up an `IntentsTestRule`. This is an\nextension of the class `ActivityTestRule` and makes it easy to use\nEspresso-Intents APIs in functional UI tests. An `IntentsTestRule` initializes\nEspresso-Intents before each test annotated with `@Test` and releases\nEspresso-Intents after each test run.\n\nThe following code snippet is an example of an `IntentsTestRule`: \n\n### Kotlin\n\n```kotlin\n@get:Rule\nval intentsTestRule = IntentsTestRule(MyActivity::class.java)\n```\n\n### Java\n\n```java\n@Rule\npublic IntentsTestRule\u003cMyActivity\u003e intentsTestRule =\n new IntentsTestRule\u003c\u003e(MyActivity.class);\n```\n\nMatch\n-----\n\nEspresso-Intents provides the ability to intercept outgoing intents based on\ncertain matching criteria, which are defined using Hamcrest Matchers. Hamcrest\nallows you to:\n\n- **Use an existing intent matcher:** Easiest option, which should almost always be preferred.\n- **Implement your own intent matcher:** Most flexible option. More details are available in the section entitled \"Writing custom matchers\" within the [Hamcrest tutorial](https://code.google.com/archive/p/hamcrest/wikis/Tutorial.wiki).\n\nEspresso-Intents offers the [`intended()`](/reference/androidx/test/espresso/intent/Intents#intended(org.hamcrest.Matcher%3Candroid.content.Intent%3E,%20androidx.test.espresso.intent.VerificationMode))\nand [`intending()`](/reference/androidx/test/espresso/intent/Intents#intending(org.hamcrest.Matcher%3Candroid.content.Intent%3E)) methods for intent validation and\nstubbing, respectively. Both take a Hamcrest `Matcher\u003cIntent\u003e` object as an\nargument.\n\nThe following code snippet shows intent validation that uses existing intent\nmatchers that matches an outgoing intent that starts a browser: \n\n### Kotlin\n\n```kotlin\nassertThat(intent).hasAction(Intent.ACTION_VIEW)\nassertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE)\nassertThat(intent).hasData(Uri.parse(\"www.google.com\"))\nassertThat(intent).extras().containsKey(\"key1\")\nassertThat(intent).extras().string(\"key1\").isEqualTo(\"value1\")\nassertThat(intent).extras().containsKey(\"key2\")\nassertThat(intent).extras().string(\"key2\").isEqualTo(\"value2\")\n```\n\n### Java\n\n```java\nassertThat(intent).hasAction(Intent.ACTION_VIEW);\nassertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE);\nassertThat(intent).hasData(Uri.parse(\"www.google.com\"));\nassertThat(intent).extras().containsKey(\"key1\");\nassertThat(intent).extras().string(\"key1\").isEqualTo(\"value1\");\nassertThat(intent).extras().containsKey(\"key2\");\nassertThat(intent).extras().string(\"key2\").isEqualTo(\"value2\");\n```\n\nValidate intents\n----------------\n\nEspresso-Intents records all intents that attempt to launch activities from the\napplication under test. Using the `intended()` method, which is similar to\n`Mockito.verify()`, you can assert that a given intent has been seen. However,\nEspresso-Intents doesn't stub out responses to intents unless you [explicitly configure](#stubbing)\nit to do so.\n\nThe following code snippet is an example test that validates, but doesn't stub\nout responses to, an outgoing intent that launches an external \"phone\" activity: \n\n### Kotlin\n\n```kotlin\n@Test fun validateIntentSentToPackage() {\n // User action that results in an external \"phone\" activity being launched.\n user.clickOnView(system.getView(R.id.callButton))\n\n // Using a canned RecordedIntentMatcher to validate that an intent resolving\n // to the \"phone\" activity has been sent.\n intended(toPackage(\"com.android.phone\"))\n}\n```\n\n### Java\n\n```java\n@Test\npublic void validateIntentSentToPackage() {\n // User action that results in an external \"phone\" activity being launched.\n user.clickOnView(system.getView(R.id.callButton));\n\n // Using a canned RecordedIntentMatcher to validate that an intent resolving\n // to the \"phone\" activity has been sent.\n intended(toPackage(\"com.android.phone\"));\n}\n```\n\nStubbing\n--------\n\nUsing the `intending()` method, which is similar to `Mockito.when()`, you can\nprovide a stub response for activities that are launched with\n`startActivityForResult()`. This is particularly useful for external activities\nbecause you cannot manipulate the user interface of an external activity nor\ncontrol the `ActivityResult` returned to the activity under test.\n\nThe following code snippets implement an example\n`activityResult_DisplaysContactsPhoneNumber()` test, which verifies that when a\nuser launches a \"contact\" activity in the app under test, the contact phone\nnumber is displayed:\n\n1. Build the result to return when a particular activity is launched. The\n example test intercepts all Intents sent to \"contacts\" and stubs out their\n responses with a valid `ActivityResult`, using the result code\n `RESULT_OK`\n\n ### Kotlin\n\n ```kotlin\n val resultData = Intent()\n val phoneNumber = \"123-345-6789\"\n resultData.putExtra(\"phone\", phoneNumber)\n val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)\n ```\n\n ### Java\n\n ```java\n Intent resultData = new Intent();\n String phoneNumber = \"123-345-6789\";\n resultData.putExtra(\"phone\", phoneNumber);\n ActivityResult result =\n new ActivityResult(Activity.RESULT_OK, resultData);\n ```\n2. Instruct Espresso to provide the stub result object in response to all\n invocations of the \"contacts\" intent:\n\n ### Kotlin\n\n ```kotlin\n intending(toPackage(\"com.android.contacts\")).respondWith(result)\n ```\n\n ### Java\n\n ```java\n intending(toPackage(\"com.android.contacts\")).respondWith(result);\n ```\n3. Verify that the action used to launch the activity produces the expected\n stub result. In this case, the example test checks that the phone number\n \"123-345-6789\" is returned and\n displayed when the \"contacts activity\" is launched:\n\n ### Kotlin\n\n ```kotlin\n onView(withId(R.id.pickButton)).perform(click())\n onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))\n ```\n\n ### Java\n\n ```java\n onView(withId(R.id.pickButton)).perform(click());\n onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));\n ```\n\nHere is the complete `activityResult_DisplaysContactsPhoneNumber()` test: \n\n### Kotlin\n\n```kotlin\n@Test fun activityResult_DisplaysContactsPhoneNumber() {\n // Build the result to return when the activity is launched.\n val resultData = Intent()\n val phoneNumber = \"123-345-6789\"\n resultData.putExtra(\"phone\", phoneNumber)\n val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)\n\n // Set up result stubbing when an intent sent to \"contacts\" is seen.\n intending(toPackage(\"com.android.contacts\")).respondWith(result)\n\n // User action that results in \"contacts\" activity being launched.\n // Launching activity expects phoneNumber to be returned and displayed.\n onView(withId(R.id.pickButton)).perform(click())\n\n // Assert that the data we set up above is shown.\n onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))\n}\n```\n\n### Java\n\n```java\n@Test\npublic void activityResult_DisplaysContactsPhoneNumber() {\n // Build the result to return when the activity is launched.\n Intent resultData = new Intent();\n String phoneNumber = \"123-345-6789\";\n resultData.putExtra(\"phone\", phoneNumber);\n ActivityResult result =\n new ActivityResult(Activity.RESULT_OK, resultData);\n\n // Set up result stubbing when an intent sent to \"contacts\" is seen.\n intending(toPackage(\"com.android.contacts\")).respondWith(result);\n\n // User action that results in \"contacts\" activity being launched.\n // Launching activity expects phoneNumber to be returned and displayed.\n onView(withId(R.id.pickButton)).perform(click());\n\n // Assert that the data we set up above is shown.\n onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));\n}\n```\n\nAdditional resources\n--------------------\n\nFor more information about using Espresso-Intents in Android tests, consult\nthe following resources.\n\n### Samples\n\n- [IntentsBasicSample](https://github.com/android/testing-samples/tree/main/ui/espresso/IntentsBasicSample): Basic usage of `intended()` and `intending()`.\n- [IntentsAdvancedSample](https://github.com/android/testing-samples/tree/main/ui/espresso/IntentsAdvancedSample): Simulates a user fetching a bitmap using the camera."]]