Утвердить, что ImageView был загружен с определенным идентификатором ресурса для рисования

Я пишу модульный тест Robolectric, и мне нужно сделать утверждение, что ImageView имеет setImageResource(int) вызвал его с определенным идентификатором ресурса. Я использую fest-android для утверждений, но, похоже, оно не содержит этого утверждения.

Я также попытался получить ShadowImageView из Robolectric для ImageView, потому что я знаю, что раньше он давал вам доступ к этому, но теперь его нет.

Наконец, я попытался вызвать setImageDrawable в своем коде вместо setImageResource, а затем в своем тестовом утверждении следующим образом:

assertThat(imageView).hasDrawable(resources.getDrawable(R.drawable.some_drawable));

но это также терпит неудачу, хотя сообщение об ошибке ясно показывает, что загружается тот же самый Drawable.


person Christopher Perry    schedule 02.08.2013    source источник


Ответы (4)


Для фона

ImageView imageView = (ImageView) activity.findViewById(R.id.imageview);
assertEquals(R.drawable.expected, Robolectric.shadowOf(imageView.getBackground()).getCreatedFromResId());

Для рисования

ImageView imageView = (ImageView) activity.findViewById(R.id.imageview);
assertEquals(R.drawable.expected, Robolectric.shadowOf(imageView.getDrawable()).getCreatedFromResId());
person Manuel    schedule 10.03.2014
comment
В robolectric 2.4 метод getImageResourceId() - person danielcooperxyz; 25.02.2015

От Робоэлектрик 3.0+

Вот как вы можете сделать:

int drawableResId = Shadows.shadowOf(errorImageView.getDrawable()).getCreatedFromResId();
assertThat("error image drawable", R.drawable.ic_sentiment_dissatisfied_white_144dp, is(equalTo(drawableResId)));
person Prakash    schedule 22.09.2016

В итоге я расширил fest-android, чтобы решить эту проблему:

public class CustomImageViewAssert extends ImageViewAssert {

    protected CustomImageViewAssert(ImageView actual) {
        super(actual);
    }

    public CustomImageViewAssert hasDrawableWithId(int resId) {
        boolean hasDrawable = hasDrawableResourceId(actual.getDrawable(), resId);
        String errorMessage = String.format("Expected ImageView to have drawable with id <%d>", resId);
        Assertions.assertThat(hasDrawable).overridingErrorMessage(errorMessage).isTrue();
        return this;
    }

    private static boolean hasDrawableResourceId(Drawable drawable, int expectedResId) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        Bitmap bitmap = bitmapDrawable.getBitmap();
        ShadowBitmap shadowBitmap = (ShadowBitmap) shadowOf(bitmap);
        int loadedFromResourceId = shadowBitmap.getCreatedFromResId();
        return expectedResId == loadedFromResourceId;
    }
}

Волшебный соус это:

ShadowBitmap shadowBitmap = (ShadowBitmap) shadowOf(bitmap);
int loadedFromResourceId = shadowBitmap.getCreatedFromResId();

который специфичен для Robolectric, поэтому я не могу отправить запрос на вытягивание на fest-android с этим.

person Christopher Perry    schedule 02.08.2013

С расширениями Котлина:

fun ImageView.hasDrawable(resId: Int): Boolean =
    Shadows.shadowOf(this.drawable).createdFromResId == resId

fun ImageView.hasBackground(resId: Int): Boolean =
    Shadows.shadowOf(this.background).createdFromResId == resId

Применение:

assertTrue(image.hasDrawable(R.drawable.image_resource))
person Oleksandr Albul    schedule 24.09.2020