Espresso:如何测试 ImageButton 的背景可绘制对象

Posted

技术标签:

【中文标题】Espresso:如何测试 ImageButton 的背景可绘制对象【英文标题】:Espresso : How to test background drawable of an ImageButton 【发布时间】:2020-05-26 00:57:30 【问题描述】:

我似乎已经跌到谷底,试图找到一个解决方案,说明如何在我的 Espresso 测试中测试我的 ImageButton 是否具有特定的背景可绘制对象。但我不断收到我粘贴在下面的错误。我尽可能多地提供了我认为相关的代码。

图像按钮

            <ImageButton
            android:id="@+id/image_button"
            android:layout_
            android:layout_
            android:background="@drawable/ic_background_selector"
            android:clickable="true"
            android:src="@drawable/background" />

选择器

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_background_error" android:state_activated="true" />
<item android:drawable="@drawable/ic_background_okay" android:state_activated="false" />
</selector>

自定义匹配器:

fun matchColor(expectedId: Int): Matcher<View> 
return object : BoundedMatcher<View, ImageButton>(ImageButton::class.java) 
    override fun describeTo(description: Description?) 
        description?.appendText("with text color: ")
        description?.appendValue(expectedId)
    

    override fun matchesSafely(item: ImageButton?): Boolean 
        return item?.context?.resources?.getDrawable(expectedId)?.constantState == item?.drawable?.constantState
    


测试:

        onView(withId(R.id.image_button)).check(matches(matchColor(R.drawable.ic_background_okay)))

我收到以下错误:

androidx.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'with text 
color: <2131165331>' doesn't match the selected view. Expected: with text color: 
<2131165331>Got: "AppCompatImageButtonid=2131296363, ...

【问题讨论】:

我打算为此写一个解决方案,但是您是否也遇到了图像视图问题?或者你所有的问题都与ImageButton有关 【参考方案1】:

我建议您在更改图像更改时设置标签并比较标签而不是图像本身。如果您没有设置标签并且不知道如何编写自定义匹配器,您可以通过活动找到您的图像按钮,并使用您在应用程序中使用的相同逻辑来比较当前存在的图像。

@Test
fun test_image_button_compare_success() 
    val activity = getActivityInstance();
    val imageButton = activity?.findViewById((R.id.image_button)) as ImageButton
    assertTrue(1 == 1) //Replace here with your control using image button

获取活动实例为taken from here

private Activity getActivityInstance() 
    final Activity[] currentActivity = null;

    getInstrumentation().runOnMainSync(new Runnable() 
        public void run() 
            Collection<Activity> resumedActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
            Iterator<Activity> it = resumedActivity.iterator();
            currentActivity[0] = it.next();
        
    );

    return currentActivity[0];

【讨论】:

不是junit测试吗?它甚至没有故意使用浓缩咖啡进行测试

以上是关于Espresso:如何测试 ImageButton 的背景可绘制对象的主要内容,如果未能解决你的问题,请参考以下文章

Espresso:如何测试 SwipeRefreshLayout?

如何使用 Espresso 测试片段是不是可见

如何使用 Espresso 测试特定活动?

如何在 Espresso 测试中单击快餐栏按钮?

如何单击位于工具栏上的按钮? [关闭]

如何在 Espresso 中重新运行失败的测试? - 头脑风暴