Espresso:如何测试 ImageButton 的可绘制背景
Espresso : How to test background drawable of an ImageButton
我似乎已经跌入谷底,试图找到一个解决方案来测试我的 ImageButton 在我的 Espresso 测试中是否具有特定的背景可绘制对象。但是我不断收到一个错误,我将其粘贴在下面。我尽可能多地提供了我认为相关的代码。
图片按钮
<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" />
选择器
<?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: "AppCompatImageButton{id=2131296363, ...}
我建议您在更改图像时设置标签并比较标签而不是图像本身。如果您没有设置标签并且不知道如何编写自定义匹配器,您可以通过 activity 找到您的图像按钮,并使用您在应用程序中使用的相同逻辑来比较当前显示的图像。
@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
}
获取activity实例是
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];
}
我似乎已经跌入谷底,试图找到一个解决方案来测试我的 ImageButton 在我的 Espresso 测试中是否具有特定的背景可绘制对象。但是我不断收到一个错误,我将其粘贴在下面。我尽可能多地提供了我认为相关的代码。
图片按钮
<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" />
选择器
<?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: "AppCompatImageButton{id=2131296363, ...}
我建议您在更改图像时设置标签并比较标签而不是图像本身。如果您没有设置标签并且不知道如何编写自定义匹配器,您可以通过 activity 找到您的图像按钮,并使用您在应用程序中使用的相同逻辑来比较当前显示的图像。
@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
}
获取activity实例是
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];
}