【问题标题】:Assert ImageView was loaded with specific drawable resource ID断言 ImageView 加载了特定的可绘制资源 ID
【发布时间】:2020-09-24 13:54:48
【问题描述】:

我正在编写 Robolectric 单元测试,我需要断言 ImageView 使用特定资源 ID 调用了 setImageResource(int)。我使用fest-android 进行断言,但它似乎不包含此断言。

我还尝试从 Robolectric 为 ImageView 获取 ShadowImageView,因为我知道它曾经让您可以访问它,但现在它已经消失了。

最后,我尝试在我的代码中调用 setImageDrawable 而不是 setImageResource,然后在我的测试断言中像这样:

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

但这也失败了,即使失败消息清楚地表明它是同一个 Drawable 正在加载。

【问题讨论】:

    标签: android unit-testing robolectric


    【解决方案1】:

    用于背景

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

    【讨论】:

    • 在 robolectric 2.4 中,方法是 getImageResourceId()
    【解决方案2】:

    来自 Roboelectric 3.0+

    你可以这样做:

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

    【讨论】:

      【解决方案3】:

      我最终扩展了 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 提交拉取请求。

      【讨论】:

        【解决方案4】:

        使用 kotlin 扩展:

        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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多