首页 > 解决方案 > Espresso 获取 recyclerView 的项目以执行操作

问题描述

我正在尝试检查我的 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) {
            }
        }
    }

正如我所说,它有效,但我不得不单击以获取该项目......

标签: androidkotlinandroid-recyclerviewandroid-espresso

解决方案


我认为您的Uiview.perform(...)电话不是在检查背景颜色。如果我假设Uiview.perform(...)与 相同onView(...).perform(...),并返回 a 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))))

推荐阅读