Я разрабатываю проект Android с использованием Kotlin. Я пишу инструментальные тесты для функциональности приложения. Теперь у меня проблема с написанием инструментированных тестов для следующего пользовательского интерфейса.
![enter image description here](https://i.stack.imgur.com/wEDwz.png)
Как видите, я использую раскладку вкладок. Под каждой вкладкой находится фрагмент, который имеет вид рециркулятора в каждой (тот же класс фрагмента).
Это сценарий, который я пытаюсь проверить.
Если вкладкавыбрано, я должен убедиться, что нужные данные загружены в соответствующее представление рециркулятора.
Проблема заключается в том, что, поскольку я использую один и тот же фрагмент для каждого фрагмента в каждой вкладке, я не могу захватить рециклерпредставление с использованием идентификатора, потому что было бы три представления переработчика с одинаковыми идентификаторами.
Это фрагментное представление xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/event_list_rc_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Это xml для каждой ячейки в представлении переработчика
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/cell_event_tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Это макет XML для основного действия
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:id="@+id/event_list_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/event_list_tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
Так я настраиваю TabLayout и ViewPager в упражнении
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_event_list)
event_list_view_pager.adapter = EventListPagerAdapter(fragmentManager = supportFragmentManager)
event_list_tab_layout.setupWithViewPager(event_list_view_pager)
}
Это представлениекласс пейджера для вкладок
class EventListPagerAdapter (fragmentManager: FragmentManager): FragmentPagerAdapter(fragmentManager) {
override fun getItem(position: Int): Fragment {
var fragment = EventListFragment()
var bundle = Bundle()
when (position) {
0 -> bundle.putInt(EventListFragment.KEY_TYPE, ApplicationController.EVENT_TYPE_CURRENT)
1 -> bundle.putInt(EventListFragment.KEY_TYPE, ApplicationController.EVENT_TYPE_FUTURE)
else -> bundle.putInt(EventListFragment.KEY_TYPE, ApplicationController.EVENT_TYPE_PAST)
}
fragment.arguments = bundle
return fragment
}
override fun getCount(): Int {
return 3
}
override fun getPageTitle(position: Int): CharSequence? {
when (position) {
0 -> return ApplicationController.instance.getString(R.string.event_list_tab_current)
1 -> return ApplicationController.instance.getString(R.string.event_list_tab_future)
}
return ApplicationController.instance.getString(R.string.event_list_tab_past)
}
}
Это тестовый класс, который я пытаюсь завершить
@RunWith(AndroidJUnit4::class)
class EventListTest {
@Rule @JvmField
val eventListActivityRule: ActivityTestRule<EventListActivity> = ActivityTestRule<EventListActivity>(EventListActivity::class.java)
@Before
fun setUp() {
}
@Test
fun eventListIndexZeroTabRendersCurrentEvents() {
onView(withId(R.id.event_list_tab_layout)).perform(selectTabAtPosition(0))
//here: how can I test if the recycler view for the tab at index zero is loaded with the right data?
}
//reference: https://stackoverflow.com/questions/49626315/how-to-select-a-specific-tab-position-in-tab-layout-using-espresso-testing?fbclid=IwAR2rvx1WW2EAaSJuM4hlNPttPxddD0CATA76Ft1RSAnsGtbMa_fU9m7ZQ4k
fun selectTabAtPosition(tabIndex: Int): ViewAction {
return object: ViewAction {
override fun getDescription(): String {
return "with tab at index $tabIndex"
}
override fun getConstraints(): Matcher<View> {
return allOf(isDisplayed(), isAssignableFrom(TabLayout::class.java))
}
override fun perform(uiController: UiController?, view: View?) {
val tabLayout = view as TabLayout
val tabAtIndex: TabLayout.Tab = tabLayout.getTabAt(tabIndex)
?: throw PerformException.Builder().withCause(Throwable("No tab at index $tabIndex")).build()
tabAtIndex.select()
}
}
}
}
Пожалуйста, обратите внимание на комментарий. Как я могу завершить свой тест, чтобы утверждать, что представление переработчика на вкладке с нулевым индексом загружено с правильными данными?