如何将 OkHttpClient MockWebServer 用于 return 和 image/byte[]?
How can I use OkHttpClient MockWebSever to return an image/byte[]?
我正在处理一个 android 库项目,我需要从 REST 服务下载 PNG 图像,将其转换为 Bitmap
和 return 到使用此库的应用程序。所以,我们有一个 REST 网络服务,它 returns 是 png 图像的字节。我们使用 Retrofit
和 rxJava
调用此服务。在我下面的代码中,accessRemoteComm.getImage()
在 Observable 上的 .map
中执行从 ResponseBody
到 Bitmap
的加载和转换。图像在应用程序中加载正常。我现在想对该方法进行单元测试,但我很难让 MockWebServer
首先交付图像。 OnError
不断被调用:
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
。但是我无法在 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;
}
android.graphics.BitmapFactory
是 Android SDK 的一部分,因此仅在 device/emulator 上可用.在您的情况下,您在主机上进行了 运行 单元测试(编译代码的地方),Android SDK 类 在该环境中不可用。根据错误判断,您使用 Mockito 模拟调用 SDK 但没有模拟 decodeStream 方法。
有几种方法可以解决这个问题:
- 使用 Roboelectric (http://robolectric.org/),它允许您在主机上调用 Android 框架方法。
- 使您的单元测试成为 android 测试(仪器化测试),这意味着它将在 emulator/device 上 运行。更多相关信息:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests
我正在处理一个 android 库项目,我需要从 REST 服务下载 PNG 图像,将其转换为 Bitmap
和 return 到使用此库的应用程序。所以,我们有一个 REST 网络服务,它 returns 是 png 图像的字节。我们使用 Retrofit
和 rxJava
调用此服务。在我下面的代码中,accessRemoteComm.getImage()
在 Observable 上的 .map
中执行从 ResponseBody
到 Bitmap
的加载和转换。图像在应用程序中加载正常。我现在想对该方法进行单元测试,但我很难让 MockWebServer
首先交付图像。 OnError
不断被调用:
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
。但是我无法在 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;
}
android.graphics.BitmapFactory
是 Android SDK 的一部分,因此仅在 device/emulator 上可用.在您的情况下,您在主机上进行了 运行 单元测试(编译代码的地方),Android SDK 类 在该环境中不可用。根据错误判断,您使用 Mockito 模拟调用 SDK 但没有模拟 decodeStream 方法。
有几种方法可以解决这个问题:
- 使用 Roboelectric (http://robolectric.org/),它允许您在主机上调用 Android 框架方法。
- 使您的单元测试成为 android 测试(仪器化测试),这意味着它将在 emulator/device 上 运行。更多相关信息:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests