假设我有一个从头开始构建的自定义视图,如下所示:
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 测试通过?
从官方文档来看,
withText()
viewMatcher 可与 Textviews 配合使用。
根据其文本属性值返回与 TextView 匹配的匹配器。
在您的情况下,您的自定义视图正在扩展
View
类。
以下是我建议的两种方法。
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
这里
当您使用
canvas.drawText
时,这意味着视图内没有文本,您正在绘制图像或形状等文本。这是一张看起来像文字的图画,但实际上并不是文字。