gpt4 book ai didi

java - 如何使用 OkHttpClient MockWebSever 返回图像/字节[]?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:27 27 4
gpt4 key购买 nike

我正在开发一个 android 库项目,我需要从 REST 服务下载 PNG 图像,将其转换为 Bitmap 并将其返回给使用该库的应用程序.因此,我们有一个返回 png 图像字节的 REST web 服务。我们使用 RetrofitrxJava 调用此服务。在我下面的代码中,accessRemoteComm.getImage().map 中执行从 ResponseBodyBitmap 的加载和转换在 Observable 上。图像在应用程序中加载正常。我现在想对该方法进行单元测试,但我很难让 MockWebServer 首先传送图像。 OnError 不断被调用:

java.lang.RuntimeException:未模拟 android.graphics.BitmapFactory 中的方法 decodeStream。有关详细信息,请参阅 http://g.co/androidstudio/not-mocked。

这是我目前所拥有的:

retrofit 界面:

@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。但是我无法在 SO 或网络上找到任何资源,这些资源显示了 MockResponse 的用法以及 Buffer 作为正文。这是部分,感谢您的帮助。如何正确设置?

顺便说一句。如果您对如何测试这个有任何其他建议,请告诉我!

谢谢!

最佳答案

我目前正在将其与 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;
}

关于java - 如何使用 OkHttpClient MockWebSever 返回图像/字节[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com