Я создал интерфейс 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?