gpt4 book ai didi

android - 使用 Robolectric 模拟 HttpResponse

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:10:08 24 4
gpt4 key购买 nike

使用 Robolectric 2.3-SNAPSHOT,我想测试一个将在后台执行请求的对象。为了隔离它,我试图模拟返回的 HttpResponse,但在投入几个小时后没有成功。

我创建了一个任何人都可以克隆的项目。只需运行 ./gradlew check https://github.com/Maragues/RobolectricDummyProject (git 克隆 https://github.com/Maragues/RobolectricDummyProject.git )

我试过了

但是测试失败了,因为他们查询的是真实的 URL

  private static final String MOCKED_WORD = "MOCKED";

@Test
public void mockedRequestUsingMockServer() throws Exception {
mMockWebServer.enqueue(new MockResponse().setBody(MOCKED_WORD));
mMockWebServer.play();

Robolectric.getFakeHttpLayer().interceptHttpRequests(false);
Robolectric.getFakeHttpLayer().interceptResponseContent(false);

String result = request.loadDataFromNetwork();

assertEquals(MOCKED_WORD, result);
}

@Test
public void mockedRequestUsingRobolectric() throws Exception {
Robolectric.setDefaultHttpResponse(200, MOCKED_WORD);

String result = request.loadDataFromNetwork();

assertEquals(MOCKED_WORD, result);
}

执行请求的代码

public String loadDataFromNetwork() throws Exception {
// With Uri.Builder class we can build our url is a safe manner
Uri.Builder uriBuilder = Uri.parse("http://robospice-sample.appspot.com/reverse").buildUpon();
uriBuilder.appendQueryParameter("word", word);

String url = uriBuilder.build().toString();

HttpURLConnection urlConnection = (HttpURLConnection) new URL(url)
.openConnection();
String result = IOUtils.toString(urlConnection.getInputStream());
urlConnection.disconnect();

return result;
}

可能相关的问题

最佳答案

您正在禁用 Roboelectric 的 HTTP 层,因此您使用的是真正的 HTTP 层。这意味着在您的测试幕后并没有巧妙的魔法发生:当您发送 HTTP 请求时,它实际上是在互联网上(如您所见)。

MockWebServer 不会阻止它。它只是在本地设置一个 Web 服务器,您的测试可以连接到该服务器。

因此,要解决此问题,您需要停止尝试连接到真实服务器,而是连接到模拟服务器。为此,您需要在请求中注入(inject)/设置 URL。

@Test
public void mockedRequestUsingMockServer() throws Exception {
mMockWebServer = new MockWebServer();
mMockWebServer.play();
mMockWebServer.enqueue(new MockResponse().setResponseCode(200).setBody(MOCKED_WORD));

request.myUrl = mMockWebServer.getUrl("/");

String result = request.loadDataFromNetwork();

assertEquals(MOCKED_WORD, result);
mMockWebServer.shutdown();
}

关于android - 使用 Robolectric 模拟 HttpResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21735084/

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