Проверьте правильность реализации Glide Image Loader - PullRequest
0 голосов
/ 27 марта 2019

Я создал интерфейс ImageDownloader в Android. Одна из реализаций использует библиотеку Glide, где загружает растровое изображение на основе URL и вызывает обратный вызов, как только битмап становится доступным.

GlideImageDownloader.java

public class GlideImageDownloader implements IImageDownloader {

    private static final String TAG = GlideImageDownloader.class.getSimpleName();

    private RequestManager mRequestManager;

    public GlideImageDownloader(Context context) {
        mRequestManager = Glide.with(context);
    }

    @Override
    public void downloadImage(String sourceUrl, DownloadImageCallback callback) {

        BitmapSimpleTarget target = new BitmapSimpleTarget(callback);

        mRequestManager
                    .load(sourceUrl)
                    .asBitmap()
                    .listener(target)
                    .into(target);
    }

    /**
     * BitmapSimple target that provides a Bitmap to the callback.  Glide manages a cache and download retries.
     */
    static class BitmapSimpleTarget extends SimpleTarget<Bitmap> implements RequestListener<String, Bitmap> {

        private DownloadImageCallback mCallback;

        BitmapSimpleTarget(@NonNull DownloadImageCallback callback) {
            super();
            this.mCallback = callback;
        }

        @Override
        public boolean onException(Exception e, String s, Target<Bitmap> target, boolean b) {
            Log.d(TAG, String.format(Locale.ROOT, "onException(%s, %s)", e, target), e);
            return false;
        }

        @Override
        public boolean onResourceReady(Bitmap bitmap, String s, Target<Bitmap> target, boolean b, boolean b1) {
            Log.i(TAG, String.format(Locale.ROOT, "onResourceReady (%s)", target));
            return false;
        }

        @Override
        public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) {
            mCallback.onBitmapReady(bitmap);
        }
    }
}

Запуск приложения работает хорошо. Однако, когда я пытаюсь создать для него отдельный модульный тест, создается впечатление, что он запускает новый поток, но никогда не вызывает обратный вызов.

Я подумал, нужно ли мне иметь поддельный сетевой слой или мне нужно вызывать какую-либо функцию для возобновления любого асинхронного вызова (поскольку я знаю, что Glide работает асинхронно).

GlideImageDownloaderTest.java

@Before
public void setup() {
    Context context = ApplicationProvider.getApplicationContext();
    glideImageDownloader = new GlideImageDownloader(context);
}

@Test
public void testDownloadImage_RegularCase() {
    CountDownLatch latch = new CountDownLatch(1);

    IImageDownloader.DownloadImageCallback callback = new IImageDownloader.DownloadImageCallback() {
        @Override
        public void onBitmapReady(Bitmap bitmap) {
            assertNotNull(bitmap);
            latch.countDown();
        }
    };

    GlideImageDownloader.BitmapSimpleTarget target = new GlideImageDownloader.BitmapSimpleTarget(callback);
    glideImageDownloader.downloadImage(URL, callback);

    latch.await();
}

Как мне правильно протестировать эту реализацию GlideImageDownloader?

...