Android测试中的模拟Api响应
我正在寻找一种在android测试中模拟api响应的方法Android测试中的模拟Api响应,android,robolectric,android-testing,Android,Robolectric,Android Testing,我正在寻找一种在android测试中模拟api响应的方法 我已经读过RoboeElectric可以用于此目的的文章,但我真的非常感谢任何关于此方面的建议。在网上浏览了一小段时间后,我发现这正是我想要的 用于测试HTTP客户端的可编写脚本的web服务器。这个库可以很容易地测试你的应用程序在进行HTTP和HTTPS调用时是否做了正确的事情。它允许您指定要返回的响应,然后验证请求是否按预期发出 要获得安装程序,只需将以下内容添加到build.gradle文件中 androidTestCompile '
我已经读过RoboeElectric可以用于此目的的文章,但我真的非常感谢任何关于此方面的建议。在网上浏览了一小段时间后,我发现这正是我想要的 用于测试HTTP客户端的可编写脚本的web服务器。这个库可以很容易地测试你的应用程序在进行HTTP和HTTPS调用时是否做了正确的事情。它允许您指定要返回的响应,然后验证请求是否按预期发出 要获得安装程序,只需将以下内容添加到build.gradle文件中
androidTestCompile 'com.google.mockwebserver:mockwebserver:20130706'
下面是一个简单的例子,取自他们的GitHub页面
public void test() throws Exception {
// Create a MockWebServer. These are lean enough that you can create a new
// instance for every unit test.
MockWebServer server = new MockWebServer();
// Schedule some responses.
server.enqueue(new MockResponse().setBody("hello, world!"));
// Start the server.
server.play();
// Ask the server for its URL. You'll need this to make HTTP requests.
URL baseUrl = server.getUrl("/v1/chat/");
// Exercise your application code, which should make those HTTP requests.
// Responses are returned in the same order that they are enqueued.
Chat chat = new Chat(baseUrl);
chat.loadMore();
assertEquals("hello, world!", chat.messages());
// Shut down the server. Instances cannot be reused.
server.shutdown();
}
希望这有帮助。MockWebServer不适合我使用AndroidTestCase。例如,ECONREFUNCE错误是随机发生的(如中所述)。我没试过机器人分子 从OKHTTP2.2.0开始,我找到了另一种对我很有效的方法:拦截器。我将整个模拟响应放在存储在
androidTest/assets/
上的json文件中,比如“mock\u response.json”。当我实例化一个OkHttp进行测试时,我公开了一个拦截器,我将重写传入的响应。基本上,body()将在“mock_response.json”中流式传输数据
public类FooApiTest扩展了AndroidTestCase{
public void testFetchData()引发InterruptedException,IOException{
//mock_response.json放在“androidTest/assets/”上
final InputStream stream=getContext().getAssets().open(“mock_response.json”);
OkHttpClient httpClient=新的OkHttpClient();
httpClient.interceptors().add(新的Interceptor()){
@凌驾
公共响应拦截(链)引发IOException{
返回新的响应。Builder()
.protocol(protocol.HTTP_2)
//这非常重要,因为它会使response.issusccessful()返回true。
.代码(200)
.request(chain.request())
.正文(新的响应正文(){
@凌驾
公共媒体类型contentType(){
返回null;
}
@凌驾
公共长内容长度(){
//意味着我们事先不知道长度。
返回-1;
}
@凌驾
公共缓冲源源(){
试一试{
返回新缓冲区().readFrom(流);
}捕获(IOE异常){
e、 printStackTrace();
返回null;
}
}
})
.build();
}
});
FooApi=新的FooApi(httpClient);
api.fetchData();
//TODO:让我们在这里断言数据。
}
}
现在使用MockWebServer更加容易:
val mocks: Map<RequestFilter, MockResponse> = mapOf(
RequestFilter("/mocked") to MockResponse().apply {
setResponseCode(200)
setBody("""{"title": "Banana Mock"}""")
},
RequestFilter("/mockedError") to MockResponse().apply {
setResponseCode(400)
}
)
val mocks:Map=mapOf(
RequestFilter(“/mocked”)到MockResponse()。应用{
设置响应代码(200)
setBody(“{”标题“:“香蕉模拟”}”)
},
将RequestFilter(“/mockedError”)更改为MockResponse()。应用{
设置响应代码(400)
}
)
只需创建RequestFilter和MockResponses的映射,然后将其插入OkHttpClient builder链:
OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.mockinize(mocks) // <-- just plug in your custom mocks here
.build()
OkHttpClient.Builder()
.addInterceptor(日志侦听器)
.mockinize(mocks)//什么是20130706
代表??