Espresso 在自定义视图中找不到文本

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

假设我有一个从头开始构建的自定义视图,如下所示:

class CustomTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : View(context, attrs, defStyleAttr, defStyleRes) {

    private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        style = Paint.Style.FILL_AND_STROKE
        textSize = 48f
        color = Color.BLUE
        strokeWidth = 3f
    }

    override fun onDraw(canvas: Canvas?) {
        canvas?.drawText("Text from Custom view", width / 2f, height / 2f, paint)
    }
}

这是非常简单的在画布上绘制文本。在片段布局中,我添加一个 TextView 和我的 CustomText 视图,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="32dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text from Text View" />

    <com.example.testing.views.CustomTextView 
        android:layout_width="250dp"
        android:layout_height="32dp"
        android:layout_marginTop="10dp" />

</LinearLayout

我的浓缩咖啡测试文件如下所示:

@RunWith(AndroidJUnit4::class)
class MyFragmentTest {
    private lateinit var scenario: FragmentScenario<MyFragment>

    @Before
    fun setup() {
        scenario = launchFragmentInContainer(themeResId = R.style.Theme_Testing)
        scenario.moveToState(Lifecycle.State.STARTED)
    }

    @Test
    fun testNormalTextView() { // -> PASSED
        onView(withText("Text from Text View")).check(matches(isDisplayed()))
    }

    @Test
    fun testCustomTextView() { // -> FAILED NoMatchingView Exception
        onView(withText("Text from Custom View")).check(matches(isDisplayed()))
    }
}

当我在物理设备上运行测试时,它仅通过

testNormalTextView
,但在
testCustomTextView
上失败。如何使用自定义视图使这些 Espresso 测试通过?

android kotlin android-espresso
2个回答
2
投票

从官方文档来看,

withText()
viewMatcher 可与 Textviews 配合使用。

根据其文本属性值返回与 TextView 匹配的匹配器。

在您的情况下,您的自定义视图正在扩展

View
类。

以下是我建议的两种方法。

  1. 使您的自定义视图扩展 TextView。 [如果您的要求是仅访问具有特定文本的视图,无论其 id 是什么]
  2. 使用
    withId()
    viewMatcher 而不是
    withText()
    ,传递 xml 布局中给定的自定义视图的 id。您需要在 xml 中为您的自定义视图提供 id。 [如果您想检查具有特定 ID 的视图,而不是其包含的文本]

在你的xml中

   <com.example.testing.views.CustomTextView 
        android:id="@+id/my_custom_view"
        android:layout_width="250dp"
        android:layout_height="32dp"
        android:layout_marginTop="10dp" />

在你的测试函数中

    @Test
    fun testCustomTextView() {
        onView(withId(R.id.my_custom_view)).check(matches(isDisplayed()))
    }

更新:

对于 recyclerview,您可以使用

onData()
而不是
onView()
在参数中传递匹配器。 您可以找到有关测试的更多信息
adapterViews
这里


0
投票

当您使用

canvas.drawText
时,这意味着视图内没有文本,您正在绘制图像或形状等文本。这是一张看起来像文字的图画,但实际上并不是文字。

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