InteractionBuilder 中没有匹配器。如何使用其 类 指定 Kakao 视图 UI-元素?

No matchers inside InteractionBuilder. How to specify Kakao view UI-element using its classes?

我在 UI 测试中使用 Espresso 框架,现在我想使用 Kakao。 我有一个带有某些视图的 MainPage,可以通过以下方式找到该视图:

class MainPage() {
    val screenTitle =
        CoreMatchers.allOf(
            withText("Main page"),
            withParent(withId(R.id.mediaViewToolbar))
        )
}

在 Espresso 测试用例中,这些行没有问题

val mainPage = MainPage()
onView(mainPage.screenTitle).check(matches(isDisplayed()))

然后我尝试用 Kakao 风格的视图重写这个 MainPage:

class MainScreen : Screen<MainScreen>() {
    // here i faced a problem
    val screenTitle = KBaseView<Matcher<View>>{    // this 2-nd line* is refferenced by error 
        CoreMatchers.allOf(
            ViewMatchers.withText("Main page"),
            ViewMatchers.withParent(ViewMatchers.withId(R.id.mediaViewToolbar))
        )
    }
}

如果尝试用 Kakao 风格编写测试用例

val mainScreen = MainScreen()
mainScreen {
    screenTitle {
        isDisplayed()
    }
}

然后我得到下一个错误:

E/TestRunner: failed: should_check_main_page(com.project.online.MainScreenKaspressoTest)
    ----- begin exception -----
    java.lang.IllegalStateException: No matchers inside InteractionBuilder
        at com.agoda.kakao.common.builders.ViewBuilder.getViewInteractionDelegate(ViewBuilder.kt:395)
        at com.agoda.kakao.common.views.KBaseView.<init>(KBaseView.kt:42)
        at com.project.online.MainScreen.<init>(MainScreen.kt:2)* - 2-nd line

我知道我在 MainScreen 中以错误的方式指定了 screenTitle,但如何正确? 谢谢!

Kakao 依靠其 ViewBuilder DSL 为视图构建必要的匹配器。 以下是您应该如何定义它:

val screenTitle = KTextView {
  withText("Main page")
  withParent { withId(R.id.mediaViewToolbar) }
}

Kakao 会自动将 allOf() 应用于所有调用的匹配器。

我在尝试使用 kaspresso(构建在 Kakao 之上的包装器)时也遇到了类似的问题 这个想法与之前答案中使用的想法或多或少相同,但您必须在使用任何自定义匹配器之前添加 withMatcher() 函数。 所以在你的情况下,它将变成

val screenTitle = KTextView {
  withText("Main page")
  withMatcher { //your custom matcher }
}