我正在尝试检查我的回收器视图项目的背景颜色,正在工作,但我不喜欢我这样做的方式,因为我强迫点击来获取它,还有其他方法可以在不表演的情况下做到这一点吗?
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) {
}
}
}
正如我所说,它有效,但我被迫点击以获取该项目......
我不认为你的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))))