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 이상 및 버전 0.3 이상과만 호환됩니다. Android 테스트 라이브러리이므로 이 행도 업데이트해야 합니다.
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)
자바
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
일치
Espresso-Intents는 특정 일치 기준을 정의합니다. 햄크레스트 를 사용하면 다음을 수행할 수 있습니다.
- 기존 인텐트 매처 사용: 거의 모든 경우에 적합한 가장 쉬운 옵션입니다. 선호될 수 있습니다
- 자체 인텐트 매처 구현: 가장 유연한 옵션입니다. 자세한 내용은 '커스텀 매처 작성' 섹션에서 확인 가능 범위 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")
자바
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는
애플리케이션입니다. 다음과 유사한 intended()
메서드 사용
Mockito.verify()
를 사용하면 지정된 인텐트가 표시되었는지 어설션할 수 있습니다. 하지만
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")) }
자바
@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()
메서드를 사용하여 다음을 수행할 수 있습니다.
kubectl run을 사용하여 시작된 활동에 대한 스텁 응답을 제공합니다.
startActivityForResult()
입니다. 이는 특히 외부 활동에 유용합니다.
외부 활동의 사용자 인터페이스를 조작할 수 없고
테스트 중인 활동으로 반환된 ActivityResult
를 제어합니다.
다음 코드 스니펫은
activityResult_DisplaysContactsPhoneNumber()
테스트:
사용자가 '연락처'를 시작함 테스트 중인 앱의 활동, 연락 가능한 휴대전화
숫자가 표시됩니다.
특정 활동이 시작될 때 반환할 결과를 빌드합니다. 이 테스트 예: '연락처'로 전송된 모든 인텐트를 가로채기 스텁을 통해 결과 코드를 사용하여 유효한
ActivityResult
가 포함된 응답RESULT_OK
Kotlin
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);
모든 요청에 대한 응답으로 스텁 결과 객체를 제공하도록 Espresso에 지시합니다. '연락처'의 인텐트:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
자바
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)))
자바
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))); }
추가 리소스
Android 테스트에서 Espresso-Intents를 사용하는 방법에 관한 자세한 내용은 다음 리소스를 참고하세요.
샘플
- IntentsBasicSample:
intended()
및intending()
의 기본 사용법입니다. - IntentsAdvancedSample이 다음과 같습니다. 카메라를 사용하여 비트맵을 가져오는 사용자를 시뮬레이션합니다.