我在操作栏中有一个按钮,其图标根据布尔值而更改。我想检查使用了哪个可绘制资源。
这是更改图标的代码:
@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); }
当需要更改图标时,菜单无效:
// request menu update supportInvalidateOptionsMenu();
最后,我要检查结果的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()));
请注意,我使用的是此处找到的自定义匹配器。
我不确定匹配器如何工作以及这是否是最好的响应,但是使用稍微不同版本的方法肯定行得通。
问题在于当前的匹配器仅适用于ImageViews。ActionMenuItemView实际上是textView的子类,因此不会匹配,并且也没有getDrawable()的方法。
请注意,这仍然需要原始帖子中的sameBitmap方法。
public static MatcherwithActionIconDrawable(@DrawableRes final int resourceId) { return new BoundedMatcher (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); } }; }