- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个 android 库项目,我需要从 REST 服务下载 PNG 图像,将其转换为 Bitmap
并将其返回给使用该库的应用程序.因此,我们有一个返回 png 图像字节的 REST web 服务。我们使用 Retrofit
和 rxJava
调用此服务。在我下面的代码中,accessRemoteComm.getImage()
在 .map
中执行从 ResponseBody
到 Bitmap
的加载和转换在 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/
我有许多不同的 OkHttpClient 请求拦截器。每个拦截器只需要应用程序发出的网络请求的一个子集。到目前为止,我已经提出了两种可能的设计。我应该: 将每个拦截器附加到单个 OkHttpClien
我的应用程序 API 执行奇怪的行为。我的一个实时应用程序的 API 预计响应时间为 2 到 3 秒,但响应时间很长! 测试用例: 使用 WIFI = 是 与 Airtel 运营商合作 = 是 与 J
我正在尝试使用 okHttpClient 4.2.1 库注册用户,作为响应,我得到了一些垃圾值 Respone is �������������V*.MNN-.V�JK�)N�Q�r�S���rR�
我将 OkHttp3 与 proxy-vole 库一起使用来自动选择要使用的代理。就我而言,使用自动配置有 4 个可能的代理可用(都是相同的概念,只是负载平衡)。然而,似乎只有其中之一可以在没有显式身
我想要获得正文响应,但收到错误 403,尽管页面在 webview 和浏览器中打开。我的代码: OkHttpClient client = new OkHttpClient();
我有一个 Web 容器 (Glassfish),在其系统属性上为一个应用程序配置了代理。 现在我在同一个 Web 容器上有另一个应用程序,我想使用 OkHttpClient 通过代码自定义代理使用。
尝试了解我在传输到 OkHttpClient 时可以定义的最佳 Java ThreadPoolTaskExecutor(延迟方面)。目前我们的定义如下: 最大队列容量(将打开新线程)为 20
在我的第一个 Android 项目中,我创建了一个 onClick 事件来调用函数: public void doSomething(View v) { String result =
okHttpClient在出现如下flag时会重试多少次才放弃public OkHttpClient.Builder retryOnConnectionFailure(boolean retryOnC
只是想模拟 OkHttpClient 以使用 Mockito 进行测试。遗憾的是,OkHttpClient 是 Mockito 不支持的最终类。有没有其他可能进行 mock ,你们在 cicrumst
我正在使用改造和 okHttp 客户端连接到我的 rest api。当我在 Tomcat 上禁用基本身份验证时,一切正常。在 Tomcat 上启用 Basic Auth 后,我收到 404 Page
我在我的类中使用注入(inject)的 OkHttpClient 对象。我正在使用方法注入(inject)在我的客户端对象上设置一些拦截器,如下所示: @Inject private OkHttpCl
我有一个 Android 应用程序需要使用 REST 连接到服务器。我使用 Retrofit 2 来处理请求,效果很好。问题是当我想使用 SSL 连接时。使用开放式 ssl,我有一个 client.c
OkHttpClient 是否可以限制实时连接数?因此,如果达到限制,则不会选择和建立新连接? 我的应用同时启动多个连接。 最佳答案 连接数可在Dispatcher中配置,而不是在仅允许配置最大空闲连
我正在为 OkHttpClient 设置连接失败时重试选项。 client = new OkHttpClient(); client.setRetryOnConnectionFailure(true)
我最近升级到 OkHttp3 ,并注意到您无法再直接从客户端取消通过标签调用。这必须由应用程序现在处理。 在 CHANGELOG 中说明这里: Canceling batches of calls i
我想使用 OkHttpClient 加载一个 url,如果给定 url 的网站以 pdf 内容类型响应,我将继续下载 PDF,否则我想忽略该响应。 我的问题是,我是否需要做任何特殊的事情来关闭请求/响
enter image description here Okhttp 使用 OkHttpClent 发送请求。 我可以使用相同的 OkHttpClent 实例在不同的线程中请求吗? 最佳答案 是的。
我想使用PipedOutputStream和 PipedInputStream流响应主体。我不太确定它在多线程方面是否安全。将从不同的线程访问响应。 public Streamer execute()
我正在努力实现这个目标 这是/delete/{id} 如何在 java 中执行此操作? String id = "123"; OkHttpClient client = new OkHttpClien
我是一名优秀的程序员,十分优秀!