Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android测试中的模拟Api响应_Android_Robolectric_Android Testing - Fatal编程技术网

Android测试中的模拟Api响应

Android测试中的模拟Api响应,android,robolectric,android-testing,Android,Robolectric,Android Testing,我正在寻找一种在android测试中模拟api响应的方法 我已经读过RoboeElectric可以用于此目的的文章,但我真的非常感谢任何关于此方面的建议。在网上浏览了一小段时间后,我发现这正是我想要的 用于测试HTTP客户端的可编写脚本的web服务器。这个库可以很容易地测试你的应用程序在进行HTTP和HTTPS调用时是否做了正确的事情。它允许您指定要返回的响应,然后验证请求是否按预期发出 要获得安装程序,只需将以下内容添加到build.gradle文件中 androidTestCompile '

我正在寻找一种在android测试中模拟api响应的方法


我已经读过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
代表??