How to mock OkHttpClient request to external URL?

Viewed 1236

I have this code in my service:

public String requestValue() {
  Call call = okHttpClient.newCall(new Request.Builder().url("external-url").build());
  Response response = call.execute();
  return response.body().string();
}

How can I mock the result of this call in a Junit test?

public void testRequestValue() {
  // TODO mock http response
  String result = myService.requestValue();
  assertEquals("value", result);
}

note: naive solution with Mockito does not work. Mockito.eq does not trigger on Request objects (seems like Request.equals provides incorrect result for identical requests).

Request request = new Request.Builder().url("external-url").build();
Response response = new Response.Builder()
  .request(request)
  .protocol(Protocol.HTTP_2)
  .code(200)
  .message("")
  .body(ResponseBody.create("value", MediaType.get("application/json")))
  .build();

Call call = Mockito.mock(Call.class);
Mockito.when(call.execute()).thenReturn(response);
Mockito.when(okHttpClientMock.newCall(Mockito.eq(request))).thenReturn(call);
1 Answers
Related