Android Studio 3.6
我的xml布局:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/waitressCallContainer"
android:layout_width="0dp"
android:layout_height="198dp"
android:layout_marginTop="@dimen/quarter_default_margin"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolBarContainer"
app:layout_goneMarginTop="@dimen/default_margin">
<ImageView
android:id="@+id/waitressCallViewCircle"
android:layout_width="144dp"
android:layout_height="144dp"
android:background="@drawable/circle_bg"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
单击waitressCallContainer
之前,我需要将waitressCallContainer
设置为isEnabled = true
和isClickable = true
。在我的代码中(我的活动)是这样的smt:
dataBinding.waitressCallContainer.isClickable = true
dataBinding.waitressCallViewCircle.isEnabled = true
不错。但是我需要在我的乐器测试中也进行此操作。
@Test
fun waitressCallContainer_click_successResponse_buttonChangeState() {
//stub response
mockServer.enqueue(
MockResponse()
.setResponseCode(200)
)
waitressCallContainer.click()
val request = mockServer.takeRequest();
onView(ViewMatchers.withId(R.id.waitressCallContainer))
.check(matches(withText("Call is made")))
因此在通话前
waitressCallContainer.click()
我需要设置:
waitressCallContainer.isClickable = true
waitressCallViewCircle.isEnabled = true
在仪器测试中是否可能(例如,通过Espresso或UIAutomator)?
具有此私有功能:
private fun <T>callMethod(message: String = "", someMethod: (view: T) -> Unit): ViewAction {
return object: ViewAction {
override fun getDescription(): String {
return if(message.isBlank()) someMethod.toString() else message
}
override fun getConstraints(): Matcher<View> {
return someMethod()
}
override fun perform(uiController: UiController?, view: View?) {
someMethod(view!! as T)
}
}
}
您应该能够以这种方式在那些视图上调用这些方法:
onView(withId(R.id.waitressCallContainer))
.perform(callMethod<View>("call isClickable() method") {
it.isClickable = true
})
onView(withId(R.id.waitressCallViewCircle))
.perform(callMethod<View>("call isEnabled() method") {
it.isEnabled = true
})
这不是唯一的方法,通过几个自定义ViewActions
(每个元素一个),您还可以在浓缩咖啡中执行所需的每条指令。但是我发现使用泛型这种方法更好。