是否可以在仪器测试中将ConstraintLayout设置为启用?

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

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 = trueisClickable = 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)?

android android-espresso android-uiautomator
1个回答
0
投票

具有此私有功能:

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(每个元素一个),您还可以在浓缩咖啡中执行所需的每条指令。但是我发现使用泛型这种方法更好。

© www.soinside.com 2019 - 2024. All rights reserved.