简体   繁体   English

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

[英]Espresso : How to test background drawable of an ImageButton

I seemed to have hit rock bottom trying to find a solution of how I can test that my ImageButton has a certain Background drawable in my Espresso test.我似乎已经跌到谷底,试图找到一个解决方案来测试我的 ImageButton 在我的 Espresso 测试中是否具有特定的背景可绘制对象。 But I keep getting an error which I pasted below.但我不断收到我粘贴在下面的错误。 I've provided as much of the code I can that I thought was relevant.我已经提供了我认为相关的尽可能多的代码。

ImageButton图像按钮

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

Selector选择器

<?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>

Custom Matcher:自定义匹配器:

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
    }

}

} }

Test:测试:

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

I get the following error:我收到以下错误:

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

I would advise you to set tags whenever you change the image changes and compare the tags instead of the images itself.我建议您在更改图像更改并比较标签而不是图像本身时设置标签。 If you are not setting tags and can't figure out how to write a custom matcher, you can find your imagebutton via activity and use the same logic you use in your application to compare which image is present right now.如果您没有设置标签并且无法弄清楚如何编写自定义匹配器,您可以通过活动找到您的 imagebutton 并使用您在应用程序中使用的相同逻辑来比较当前存在的图像。

@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
}

Getting activity instance is 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];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM