Rém*_*i F 4 android android-actionbar android-testing android-support-library android-espresso
我在操作栏中有一个按钮,其图标根据布尔值而更改。我想检查使用了哪个可绘制资源。
这是更改图标的代码:
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem item = menu.findItem(R.id.menu_favorite);
if(mIsFavorite)
item.setIcon(R.drawable.ab_icon_on);
else
item.setIcon(R.drawable.ab_icon_off);
}
Run Code Online (Sandbox Code Playgroud)
当需要更改图标时,菜单无效:
// request menu update
supportInvalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)
最后,我要检查结果的espresso代码:
@Test
public void action_setUnsetFavorite() {
// check favorite off
onView(withImageDrawable(R.drawable.ab_icon_off))
.check(matches(isDisplayed()));
// click favorite button
onView(withId(R.id.menu_favorite))
.perform(click());
// check favorite on
onView(withImageDrawable(R.drawable.ab_icon_on))
.check(matches(isDisplayed()));
Run Code Online (Sandbox Code Playgroud)
请注意,我使用的是此处找到的自定义匹配器。
我不确定匹配器如何工作以及这是否是最好的响应,但是使用稍微不同版本的方法肯定行得通。
问题在于当前的匹配器仅适用于ImageViews。ActionMenuItemView实际上是textView的子类,因此不会匹配,并且也没有getDrawable()的方法。
请注意,这仍然需要原始帖子中的sameBitmap方法。
public static Matcher<View> withActionIconDrawable(@DrawableRes final int resourceId) {
return new BoundedMatcher<View, ActionMenuItemView>(ActionMenuItemView.class) {
@Override
public void describeTo(final Description description) {
description.appendText("has image drawable resource " + resourceId);
}
@Override
public boolean matchesSafely(final ActionMenuItemView actionMenuItemView) {
return sameBitmap(actionMenuItemView.getContext(), actionMenuItemView.getItemData().getIcon(), resourceId);
}
};
}
Run Code Online (Sandbox Code Playgroud)