Espresso获得recyclerView的一项操作

问题描述 投票:0回答:1

我正在尝试检查recyclerView的某个项目的背景颜色,是否可以正常工作,但是我不喜欢这样做的方式,因为我强迫单击以获取它,是否还有其他方法可以执行此操作没有表演?

Uiview.perform(
            RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(
                position,
                click()
            )
        ).apply {
            withBackgroundColor(color)
        }

并且withBackgroundColor方法是:

private fun withBackgroundColor(@ColorInt color: Int): Matcher<RecyclerView.ViewHolder> {
        return object :
            BoundedMatcher<RecyclerView.ViewHolder, RecyclerView.ViewHolder>(
                RecyclerView.ViewHolder::class.java
            ) {
            override fun matchesSafely(item: RecyclerView.ViewHolder): Boolean {
                return (item.itemView.background as ColorDrawable).color == color
            }

            override fun describeTo(description: Description) {
            }
        }
    }

正如我说的,它可以工作,但是我被迫单击以获取该项目...

android kotlin android-recyclerview android-espresso
1个回答
0
投票

我不认为您的Uiview.perform(...)通话正在检查背景颜色。如果我假设Uiview.perform(...)onView(...).perform(...)相同,并返回ViewHolder,则随后的apply将被“孤立”-除了单击该项目外,它不会做其他任何事情,也许是原因为什么您看到考试通过了?

否则,您可以简单地创建自己的自定义RecyclerView匹配器以及ViewHolder

fun <VH : RecyclerView.ViewHolder> hasHolderItemAtPosition(position: Int, matcher: Matcher<VH>): Matcher<View> {
    return object : BoundedMatcher<View, RecyclerView>(RecyclerView::class.java) {
        override fun describeTo(description: Description) {
            description.appendText("has holder item: ")
            matcher.describeTo(description)
            description.appendText(" at position: $position")
        }

        override fun matchesSafely(view: RecyclerView): Boolean {
            return view.adapter?.let {
                val type = it.getItemViewType(position)
                val holder = it.createViewHolder(view, type)
                it.onBindViewHolder(holder, position)
                return matcher.matches(holder)
            } ?: false
        }
    }
}

然后使用背景色执行检查:

onView(your_recycler_view)
    .check(matches(hasHolderItemAtPosition(position, withBackgroundColor(color))))
© www.soinside.com 2019 - 2024. All rights reserved.