Espresso দুই ধরনের তালিকার জন্য নির্দিষ্ট আইটেমে স্ক্রল করা বা অ্যাকশন নেওয়ার মেকানিজম অফার করে: অ্যাডাপ্টার ভিউ এবং রিসাইকেলার ভিউ।
তালিকা নিয়ে কাজ করার সময়, বিশেষ করে RecyclerView বা
AdapterView অবজেক্ট দিয়ে তৈরি তালিকার ক্ষেত্রে, আপনি যে ভিউ দেখতে চান সেটি স্ক্রিনে নাও থাকতে পারে, কারণ
স্ক্রল করার সময় অল্প সংখ্যক চাইল্ড ভিউ দেখানো হয় এবং
রিসাইকেল করা হয়। এই ক্ষেত্রে scrollTo() পদ্ধতি ব্যবহার করা যাবে না
কারণ এর জন্য আগে থেকে থাকা ভিউ প্রয়োজন।
অ্যাডাপ্টার ভিউ লিস্ট আইটেমের সাথে ইন্টার্যাক্ট করুন
onView() পদ্ধতি ব্যবহার করার পরিবর্তে, onData() দিয়ে আপনার সার্চ শুরু করুন এবং
আপনি যে ভিউ ম্যাচ করতে চান, সেই ডেটার সাথে ম্যাচ করে এমন কিছু প্রদান করুন।
Espresso Adapter অবজেক্টে সারি খোঁজা এবং
ভিউ পোর্টে আইটেমটি দৃশ্যমান করার সমস্ত কাজ করবে।
কাস্টম ভিউ ম্যাচিং ব্যবহার করে ডেটা ম্যাচ করুন
নিচের অ্যাক্টিভিটিতে একটি ListView আছে, যা একটি SimpleAdapter দ্বারা সমর্থিত
যা Map<String, Object> অবজেক্টের প্রতিটি সারির ডেটা ধারণ করে।

প্রতিটি ম্যাপে দুটি এন্ট্রি আছে: একটি কী "STR" যাতে স্ট্রিং আছে, যেমন
"item: x" এবং একটি কী "LEN" যাতে Integer আছে, যা কন্টেন্টের দৈর্ঘ্য
উপস্থাপিত করে। যেমন:
{"STR" : "item: 0", "LEN": 7}
"আইটেম: ৫০" সহ সারিতে ক্লিক করার কোডটি এইরকম দেখায়:
Kotlin
onData(allOf(`is`(instanceOf(Map::class.java)), hasEntry(equalTo("STR"), `is`("item: 50")))).perform(click())
জাভা
onData(allOf(is(instanceOf(Map.class)), hasEntry(equalTo("STR"), is("item: 50")))) .perform(click());
মনে রাখবেন, Espresso প্রয়োজন অনুযায়ী তালিকার মধ্যে অটোমেটিক স্ক্রল করে।
আসুন, onData()-এর ভিতরে Matcher<Object>-কে আলাদা করি। is(instanceOf(Map.class)) মেথডটি
AdapterView-এর যেকোনও আইটেমে সার্চকে সীমাবদ্ধ করে, যা একটি Map অবজেক্ট দ্বারা সমর্থিত।
আমাদের ক্ষেত্রে, কোয়েরির এই দিকটি তালিকা ভিউয়ের প্রতিটি সারির সাথে মেলে, কিন্তু আমরা নির্দিষ্টভাবে কোনও আইটেমে ক্লিক করতে চাই, তাই আমরা সার্চকে আরও সংকুচিত করি:
Kotlin
hasEntry(equalTo("STR"), `is`("item: 50"))
জাভা
hasEntry(equalTo("STR"), is("item: 50"))
এই Matcher<String, Object> এমন যেকোনও ম্যাপের সাথে মিলবে যাতে "STR" কী এবং "item: 50" ভ্যালু সহ
এন্ট্রি আছে। যেহেতু এটি খোঁজার কোডটি
দীর্ঘ এবং আমরা এটি অন্যান্য লোকেশনে আবার ব্যবহার করতে চাই, তাই আসুন এটির জন্য একটি কাস্টম
withItemContent ম্যাচিং লিখি:
Kotlin
return object : BoundedMatcher<Object, Map>(Map::class.java) { override fun matchesSafely(map: Map): Boolean { return hasEntry(equalTo("STR"), itemTextMatcher).matches(map) } override fun describeTo(description: Description) { description.appendText("with item content: ") itemTextMatcher.describeTo(description) } }
জাভা
return new BoundedMatcher<Object, Map>(Map.class) { @Override public boolean matchesSafely(Map map) { return hasEntry(equalTo("STR"), itemTextMatcher).matches(map); } @Override public void describeTo(Description description) { description.appendText("with item content: "); itemTextMatcher.describeTo(description); } };
আপনি বেস হিসেবে BoundedMatcher ব্যবহার করেন কারণ শুধুমাত্র Map ধরনের অবজেক্ট ম্যাচ করতে হবে। matchesSafely() পদ্ধতি ওভাররাইড করুন, আগে খুঁজে পাওয়া ম্যাচিং কোড
ইনপুট করুন এবং আপনি আর্গুমেন্ট হিসেবে পাস করতে পারেন এমন Matcher<String>-এর সাথে
ম্যাচ করুন। এটি আপনাকে withItemContent(equalTo("foo"))-কে কল করার অনুমতি দেয়। কোড
সংক্ষিপ্ত করতে, আপনি অন্য একটি ম্যাচিং ফাংশন তৈরি করতে পারেন যা আগে থেকেই equalTo() কল করে এবং
একটি String অবজেক্ট গ্রহণ করে:
Kotlin
fun withItemContent(expectedText: String): Matcher<Object> { checkNotNull(expectedText) return withItemContent(equalTo(expectedText)) }
জাভা
public static Matcher<Object> withItemContent(String expectedText) { checkNotNull(expectedText); return withItemContent(equalTo(expectedText)); }
এখন আইটেমে ক্লিক করার কোডটি সহজ:
Kotlin
onData(withItemContent("item: 50")).perform(click())
জাভা
onData(withItemContent("item: 50")).perform(click());
এই পরীক্ষার সম্পূর্ণ কোডের জন্য, AdapterViewTest ক্লাসের মধ্যে testClickOnItem50() পদ্ধতি এবং GitHub-এ এই কাস্টম LongListMatchers ম্যাচারের দিকে নজর দিন।
নির্দিষ্ট চাইল্ড ভিউয়ের সাথে মেলান
উপরের স্যাম্পেলটি ListView-এর সম্পূর্ণ সারির মাঝখানে ক্লিক করে।
কিন্তু আমরা যদি সারির কোনও নির্দিষ্ট চাইল্ডের উপর কাজ করতে চাই? যেমন, আমরা
LongListActivity-এর সারির দ্বিতীয় কলামে ক্লিক করতে চাই,
যা প্রথম কলামে কন্টেন্টের String.length দেখায়:

DataInteraction-এর প্রয়োগে শুধু একটি onChildView() স্পেসিফিকেশন যোগ করুন:
Kotlin
onData(withItemContent("item: 60")) .onChildView(withId(R.id.item_size)) .perform(click())
জাভা
onData(withItemContent("item: 60")) .onChildView(withId(R.id.item_size)) .perform(click());
রিসাইকেলার ভিউ তালিকার আইটেমের সাথে ইন্টার্যাক্ট করুন
RecyclerView অবজেক্ট AdapterView অবজেক্টের থেকে আলাদাভাবে কাজ করে, তাই
onData() সেগুলির সাথে ইন্টার্যাক্ট করার জন্য ব্যবহার করা যাবে না।
Espresso ব্যবহার করে RecyclerViews-এর সাথে ইন্টার্যাক্ট করতে, আপনি
espresso-contrib প্যাকেজ ব্যবহার করতে পারেন, যাতে
RecyclerViewActions-এর
কালেকশন আছে যা পজিশনে স্ক্রল করতে বা আইটেমে অ্যাকশন পারফর্ম করতে ব্যবহার করা যেতে পারে:
scrollTo()- ম্যাচ করা ভিউতে স্ক্রল করে, যদি সেটি থাকে।scrollToHolder()- ম্যাচ করা ভিউ হোল্ডার থাকলে, সেখানে স্ক্রল করে নিয়ে যায়।scrollToPosition()- স্ক্রল করে নির্দিষ্ট পজিশনে যায়।actionOnHolderItem()- ম্যাচ করা ভিউ হোল্ডারে ভিউ অ্যাকশন পারফর্ম করে।actionOnItem()- ম্যাচ করা ভিউতে ভিউ অ্যাকশন পারফর্ম করে।actionOnItemAtPosition()- নির্দিষ্ট পজিশনে ভিউতে ViewAction পারফর্ম করে।
নিম্নলিখিত স্নিপেটে RecyclerViewSample স্যাম্পেল থেকে কিছু উদাহরণ দেখানো হয়েছে:
Kotlin
@Test(expected = PerformException::class) fun itemWithText_doesNotExist() { // Attempt to scroll to an item that contains the special text. onView(ViewMatchers.withId(R.id.recyclerView)) .perform( // scrollTo will fail the test if no item matches. RecyclerViewActions.scrollTo( hasDescendant(withText("not in the list")) ) ) }
জাভা
@Test(expected = PerformException.class) public void itemWithText_doesNotExist() { // Attempt to scroll to an item that contains the special text. onView(ViewMatchers.withId(R.id.recyclerView)) // scrollTo will fail the test if no item matches. .perform(RecyclerViewActions.scrollTo( hasDescendant(withText("not in the list")) )); }
Kotlin
@Test fun scrollToItemBelowFold_checkItsText() { // First, scroll to the position that needs to be matched and click on it. onView(ViewMatchers.withId(R.id.recyclerView)) .perform( RecyclerViewActions.actionOnItemAtPosition( ITEM_BELOW_THE_FOLD, click() ) ) // Match the text in an item below the fold and check that it's displayed. val itemElementText = "${activityRule.activity.resources .getString(R.string.item_element_text)} ${ITEM_BELOW_THE_FOLD.toString()}" onView(withText(itemElementText)).check(matches(isDisplayed())) }
জাভা
@Test public void scrollToItemBelowFold_checkItsText() { // First, scroll to the position that needs to be matched and click on it. onView(ViewMatchers.withId(R.id.recyclerView)) .perform(RecyclerViewActions.actionOnItemAtPosition(ITEM_BELOW_THE_FOLD, click())); // Match the text in an item below the fold and check that it's displayed. String itemElementText = activityRule.getActivity().getResources() .getString(R.string.item_element_text) + String.valueOf(ITEM_BELOW_THE_FOLD); onView(withText(itemElementText)).check(matches(isDisplayed())); }
Kotlin
@Test fun itemInMiddleOfList_hasSpecialText() { // First, scroll to the view holder using the isInTheMiddle() matcher. onView(ViewMatchers.withId(R.id.recyclerView)) .perform(RecyclerViewActions.scrollToHolder(isInTheMiddle())) // Check that the item has the special text. val middleElementText = activityRule.activity.resources .getString(R.string.middle) onView(withText(middleElementText)).check(matches(isDisplayed())) }
জাভা
@Test public void itemInMiddleOfList_hasSpecialText() { // First, scroll to the view holder using the isInTheMiddle() matcher. onView(ViewMatchers.withId(R.id.recyclerView)) .perform(RecyclerViewActions.scrollToHolder(isInTheMiddle())); // Check that the item has the special text. String middleElementText = activityRule.getActivity().getResources() .getString(R.string.middle); onView(withText(middleElementText)).check(matches(isDisplayed())); }
অতিরিক্ত রিসোর্স
Android টেস্টে Espresso তালিকা ব্যবহার করার ব্যাপারে আরও তথ্য পেতে, নিম্নলিখিত রিসোর্স দেখুন।
নমুনা
- DataAdapterSample:
Espresso-র জন্য
onData()এন্ট্রি পয়েন্ট দেখায়, তালিকা ওAdapterViewঅবজেক্টের জন্য।