3

我在操作欄中有一個按鈕,其中的圖標根據布爾值進行更改。我想檢查使用哪種可繪製資源。如何在Espresso中測試ActionMenuItemView的圖標

這裏就是圖標改變了代碼:

@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(); 

最後,我的咖啡代碼,我想檢查結果:

@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())); 

請注意,我正在使用自定義匹配程序找到here

回答

3

我並不是100%確定匹配器是如何工作的,以及這是否是最好的響應,但是使用稍微不同的方法版本當然可行。

問題是,當前匹配器只能與ImageViews一起使用。 ActionMenuItemView實際上是textView的子類,所以不會匹配,也沒有getDrawable()的方法。

請注意,這仍然需要與原始帖子相同的位圖方法。

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); 
     } 
    }; 
} 
相關問題