0

我有通過自定義適配器等生成不同顏色的行一個ListView:比賽背景色咖啡

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    convertView = mInflater.inflate(R.layout.row_unit, parent, false); 

    // ... 

    if(/* some condition */) { 
     convertView.setBackgroundColor(Color.LTGRAY); 
    } else { 
     convertView.setBackgroundColor(Color.WHITE); 
    } 
    return convertView; 
} 

在測試中,我想檢查在列表中的某個元素是否具有顏色LTGRAY。我創建了一個自定義的匹配:

public static Matcher<Object> backgroundShouldHaveColor(int expectedColor) { 
    return viewShouldHaveBackgroundColor(equalTo(expectedColor)); 
} 
private static Matcher<Object> viewShouldHaveBackgroundColor(final Matcher<Integer> expectedObject) { 
    final int[] color = new int[1]; 
    return new BoundedMatcher<Object, View>(View.class) { 
     @Override 
     public boolean matchesSafely(View view) { 

      color[0] =((ColorDrawable) view.getBackground()).getColor(); 


      if(expectedObject.matches(color[0])) { 
       return true; 
      } else { 
       return false; 
      } 
     } 
     @Override 
     public void describeTo(final Description description) { 
      // Should be improved! 
      description.appendText("Color did not match " + color[0]); 
     } 
    }; 
} 

試圖與

onView(withText("itemtext")).check(matches(backgroundShouldHaveColor(Color.LTGRAY))); 

我得到一個空指針異常進行測試。

回答

1

下,似乎爲我工作:

onView(withChild(withText("itemtext"))) // this matches the LinearLayout or row/convertview 
     .check(matches(withBgColor(Color.LTGRAY))); 

下,定製匹配是:

public static Matcher<View> withBgColor(final int color) { 
    Checks.checkNotNull(color); 
    return new BoundedMatcher<View, LinearLayout>(LinearLayout.class) { 
     @Override 
     public boolean matchesSafely(LinearLayout row) { 
      return color == ((ColorDrawable) row.getBackground()).getColor(); 
     } 
     @Override 
     public void describeTo(Description description) { 
      description.appendText("with text color: "); 
     } 
    }; 
} 

這是一個三分欄列表視圖,其中每一行由一個LinearLayout中的3個孩子TextViews 。 「withText(」itemtext「)」匹配第一列中的元素/ TextView。此列中的元素是唯一的。