5

私は、REST サービスから PNG 画像をダウンロードし、それを に変換して、Bitmapこのライブラリを使用してアプリに返す必要がある Android ライブラリ プロジェクトに取り組んでいます。したがって、png 画像のバイトを返す REST Web サービスがあります。Retrofitwithを使用してこのサービスを呼び出していますrxJava。以下のコードでは、Observableの aから aへaccessRemoteComm.getImage()の読み込みと変換を行います。画像はアプリケーションに正常に読み込まれます。その方法を単体テストしたいのですが、そもそも画像を配信するのに苦労しています。は、次のように常に呼び出されます。ResponseBodyBitmap.mapMockWebServerOnError

java.lang.RuntimeException: Method decodeStream in android.graphics.BitmapFactory not mocked. See http://g.co/androidstudio/not-mocked for details.

これは私がこれまでに持っているものです:

後付けインターフェース:

@GET("webapi/user/{ID}/image")
Observable<ResponseBody> getVehicleImage(
        @Path("ID") @NonNull final String id,
        @Query("width") @NonNull final int width,
        @Query("height") @NonNull final int height,
        @Query("view") @NonNull final ImageView view
);

getImage() メソッド:

public Observable<Bitmap> getVehicleImage(@NonNull String id, @NonNull Integer width, @NonNull Integer height, @NonNull ImageView view) {
    return service.getImage(id, width, height, view).map(new Func1<ResponseBody, Bitmap>() {
        @Override
        public Bitmap call(ResponseBody responseBody) {
            BufferedInputStream isr = new BufferedInputStream(responseBody.byteStream());
            return BitmapFactory.decodeStream(isr);
        }
    });
}

私のテスト方法:

@Test
public void testGetVehicleImage() throws Exception {

    String path = basePathForImages + "vehicleTestImage.png";

    Source pngSource = Okio.source(new File(path));

    BufferedSource bufferedSrc = Okio.buffer(pngSource);

    server.enqueue(new MockResponse()
            .setResponseCode(200)
            .setHeader("Content-Type", "image/png")
            .setBody(bufferedSrc.buffer()));

    Subscriber<Bitmap> subscriber = new Subscriber<Bitmap>() {
        @Override
        public void onCompleted() {
            Log.d("OnComplete");
        }

        @Override
        public void onError(Throwable e) {
             Log.d(e.toString());
             //java.lang.RuntimeException: 
             //Method decodeStream in android.graphics.BitmapFactory not mocked.
        }

        @Override
        public void onNext(Bitmap bitmap) {
            Log.d("Yeeee");
        }
    };

    Observable<Bitmap> observable = accessRemoteCommVehicle.getVehicleImage("abc", 0, 0, VehicleImageView.FRONT);

    observable.toBlocking().subscribe(subscriber);
}

bufferedSource正しくセットアップしていないことは確かです。MockResponseしかし、SO や WebでBufferas bodyの使用法を示すリソースが見つかりません。そして、これは、助けがあればありがたい部分です。これを正しく設定するにはどうすればよいですか?

ところで。これをテストする方法について他に提案がある場合は、お知らせください。

ありがとうございました!

4

2 に答える 2

7

私は現在これを MockWebServer で使用しており、機能しているようですが、いくらかのマイレージを使用できます。試してみて結果をフィードバックしていただければ、コミュニティに有益です。

         import okio.Buffer;
         private final static String TAG = "MYCLASS";
         public static String extPathToPngFile = Environment.getExternalStorageDirectory().getPath() + "/some-icon.png";

         Buffer responseBody = getBinaryFileAsBuffer(extPathToPngFile);

                             ... context removed for brevity ...

         new MockResponse().setResponseCode(200).addHeader("Content-Type:image/png").setBody(responseBody);

        //Buffer wrap a binary file to return with a mock.
        public static Buffer getBinaryFileAsBuffer(String path) throws IOException {
                        File file = new File(path);
                        byte[] fileData = FileUtils.readFileToByteArray(file);
                        Buffer buf = new Buffer();
                        buf.write(fileData);
                        Log.d(TAG, "BUFFER SIZE FOR "+path+" IS:" + buf.size());
                        return buf;
                    }
于 2016-11-15T13:09:12.050 に答える