Espresso 테스트에서 배경에 border가 있는지 확인 Matcher
문제
아래 그림과 같이
RecyclerView
기반 앱이 있으며 내부 상태에 따라 ViewHolder
에 테두리를 붙이거나 붙이지 않습니다. 테두리가 없는 것은 background
에 다른 shape
를 지정하는 것으로 실현되고 있습니다. ( stroke
를 구현한 shape
에는 테두리가 붙어, stroke
가 없으면 붙습니다.)
그런데 기대했던
ViewHolder
이외에도 테두리가 그려진다는 버그가 발생했습니다. 아마 ViewHolder
재사용으로 인한 버그라고 생각합니다. 곧바로 고치면 됩니다만, 이것은 UI 테스트를 쓰는 곳일 것이라고 말하는 것으로, 처음으로 제대로 Espresso 테스트를 해 보았습니다.그러나 이렇게 말하는 외형을 비교한다
Matcher
라고 말하는 것은 코어의 라이브러리에서는 제대로 준비되어 있지 않아서, 타사에서도 발견되지 않았기 때문에 스스로 써 보기로 했습니다. (초보자이므로 간과하고 있을 가능성도 크지만)itemView.background
ViewHolder
의 itemView.background
상태를 조사하는 것이므로, 그것이 몇 클래스에 속하고 있는지를 먼저 조사합니다. 디버깅하여 Chimachima ViewHolder
객체 트리를 추적합니다.
있었다!
mBackground
속성은 GradientDrawable
의 인스턴스이며,이 녀석에는 mStrokePaint
라는 속성이 있습니다. 이 프로퍼티에 실체가 있으면 경계가 있고, null
이면 경계 없음입니다.Matcher
Matcher
구현은 다음과 같습니다.fun backgroundHasBorder(): Matcher<View> {
return object : TypeSafeMatcher<View>(View::class.java!!) {
override fun describeTo(description: Description) {
description.appendText("to have a border")
}
override fun matchesSafely(foundView: View): Boolean {
val gradientDrawable = (foundView.background as? GradientDrawable)
if (gradientDrawable == null) {
print("Background is not a gradient")
return false
}
val field = (GradientDrawable::class.java.getDeclaredField("mStrokePaint"))
field.isAccessible = true
val stroke = field.get(gradientDrawable)
return stroke != null
}
}
}
GradientDrawable.mStrokePoint
는 프라이빗 프로퍼티로, 이것을 공개하고 있는 메소드가 없기 때문에, 리플렉션으로 액세스하고 있습니다.사용법
국경이있을 때 (때)
onView(withId(R.id.SomeId))
.check(matches(backgroundHasBorder()))
테두리가 없을 때
onView(withId(R.id...))
.check(not(matches(backgroundHasBorder())))
NOTE : 이번 앱의 경우
RecyclerView
의 ViewHolder
에 대해 평가하고 싶습니다. 있습니다. 1감상
RecyclerView
로 정의한 ViewHolder
가 withId(...)
가 아니고, shape
가 된다고 하는 것은 의외였습니다. 확실히 rect 나 ellipse 기반이 아닌 더 복잡한 background
를 정의하면 ShapeDrawable
될 것입니까?GradientDrawable
의 shape
를 쓰거나 하는 것은, 조사만 하면 원 패스는 통과할 수 있다고 하는 느낌이 있습니다. 다만 Proguard를 쓰면 확실히 빠질 것 같다. 일반적으로
ShapeDrawable
액세스가 생각했던 것보다 힘들고 빠졌습니다. 그 밖에도 방법은 있을지도 모릅니다만 RecyclerViewMatcher 라고 하는 것을 카피해 와서 사용했습니다. 이것을 사용하는 경우, View 의 Matcher 에는 View
로 액세스하는 것이 아니라, Matcher
로 액세스합니다. ↩Reference
이 문제에 관하여(Espresso 테스트에서 배경에 border가 있는지 확인 Matcher), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yfujiki/items/4198a766b526b073de8d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)