LinearLayout getBackground().getColor() возвращает неправильное значение int

#android #android-espresso

#Android #android-эспрессо

Вопрос:

Я выполняю тесты пользовательского интерфейса с использованием espresso. Мой босс хочет, чтобы я проверил, что после определенного действия LinearLayout имеет новый и правильный цвет. Я написал пользовательский сопоставитель, который выглядит следующим образом

 public static Matcher<View> withBgColor(final int color) {

    Checks.checkNotNull(color);

    return new BoundedMatcher<View, LinearLayout>(LinearLayout.class) {
        @Override
        public boolean matchesSafely(LinearLayout layout) {
            MyLog.debug(String.valueOf(color)   " vs "   String.valueOf(((ColorDrawable) layout.getBackground()).getColor()));
            return color == ((ColorDrawable) layout.getBackground()).getColor();
            //return color == (((PaintDrawable) layout.getBackground()).getPaint()).getColor();
        }
        @Override
        public void describeTo(Description description) {
            description.appendText("With background color: ");
        }
    };
}
 

Моя проблема в том, что сравнение предоставленного цвета и цвета фона не совпадают. В приложении я вижу, что установлен правильный цвет. Это делается следующим образом:

 holder.linearLayout.setBackgroundColor(ctx.getResources().getColor(R.color.grey_300));
 

Как только тест пытается сравнить значения, они отличаются друг от друга:

 Log: CustomMatcher: 17170432 vs -2039584
 

Я вызываю сопоставитель следующим образом

 .check(matches(withBgColor(R.color.grey_300)));
 

Кто-нибудь может мне помочь, как я могу проверить, совпадает ли цвет? То, как я делал, каждый раз терпит неудачу… Спасибо

Ответ №1:

Проблема в том, что и цвет, и идентификатор цветового ресурса реализованы как целые числа. Вы передаете значение R.color.grey_300 , которое представляет собой сгенерированное число, представляющее идентификатор ресурса, вместо самого цвета.

Вместо этого вы должны соответствовать таким образом: .check(matches(withBgColor(context.getColor(R.color.grey_300))));

Если вы беспокоитесь, что getColor() это устарело, используйте ContextCompat.getColor(context, R.color.grey_300) вместо этого.

Комментарии:

1. Спасибо, что сработало. Какая глупая ошибка.. Спас мой день!

2. Нет проблем! То же самое произошло со мной некоторое время назад при использовании ArgbEvaluator для анимации некоторых значений цвета…