Assert ImageView был загружен конкретным идентификатором ресурса ресурса

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

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

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

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

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

Solutions Collecting From Web of "Assert ImageView был загружен конкретным идентификатором ресурса ресурса"

С Robolectric 2.2:

Для этого вам нужно сделать небольшое косвенное указание. ShadowImageView не помогает. Вместо этого используйте ShadowDrawable:

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

надеюсь, это поможет

Я закончил тем, что расширил фестиваль-андроид, чтобы решить эту проблему:

 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, поэтому я не могу представить запрос на вытаскивание для фестиваля-андроида с этим.

От Roboelectric 3.0+

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

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