使用 mockito 模拟 HttpClient 请求
Mocking HttpClient requests with mockito
我有以下代码,希望使用 Junit 和 Mockito 进行测试。
要测试的代码:
Header header = new BasicHeader(HttpHeaders.AUTHORIZATION,AUTH_PREAMBLE + token);
List<Header> headers = new ArrayList<Header>();
headers.add(header);
HttpClient client = HttpClients.custom().setDefaultHeaders(headers).build();
HttpGet get = new HttpGet("real REST API here"));
HttpResponse response = client.execute(get);
String json_string_response = EntityUtils.toString(response.getEntity());
和测试
protected static HttpClient mockHttpClient;
protected static HttpGet mockHttpGet;
protected static HttpResponse mockHttpResponse;
protected static StatusLine mockStatusLine;
protected static HttpEntity mockHttpEntity;
@BeforeClass
public static void setup() throws ClientProtocolException, IOException {
mockHttpGet = Mockito.mock(HttpGet.class);
mockHttpClient = Mockito.mock(HttpClient.class);
mockHttpResponse = Mockito.mock(HttpResponse.class);
mockStatusLine = Mockito.mock(StatusLine.class);
mockHttpEntity = Mockito.mock(HttpEntity.class);
Mockito.when(mockHttpClient.execute(Mockito.isA(HttpGet.class))).thenReturn(mockHttpResponse);
Mockito.when(mockHttpResponse.getStatusLine()).thenReturn(mockStatusLine);
Mockito.when(mockStatusLine.getStatusCode()).thenReturn(HttpStatus.SC_OK);
Mockito.when(mockHttpResponse.getEntity()).thenReturn(mockHttpEntity);
}
@Test
underTest = new UnderTest(initialize with fake API (api));
//Trigger method to test
这给了我一个错误:
java.net.UnknownHostException: api: nodename nor servname provided, or
not known
为什么不像设置中那样模拟 'client.execute(get)'
调用?
你目前拥有的是:
mockHttpClient = Mockito.mock(HttpClient.class);
Mockito.when(mockHttpClient.execute(Mockito.isA(HttpGet.class))).thenReturn(mockHttpResponse)
所以有一个 mock 应该对 execute()
.
的调用做出反应
然后你有:
1) underTest = new UnderTest(initialize with fake API (api));
2) // Trigger method to test
问题是:您的设置中的第 1 行或第 2 行有问题。但是我们不能告诉你;因为您没有向我们提供该代码。
问题是:为了使您的 mock 对象可用,它需要被 [=23=使用 ]underTest不知何故。因此,当您以某种方式错误地执行 init 时,underTest 不会使用模拟的东西,而是一些 "real" 东西。
我有以下代码,希望使用 Junit 和 Mockito 进行测试。
要测试的代码:
Header header = new BasicHeader(HttpHeaders.AUTHORIZATION,AUTH_PREAMBLE + token);
List<Header> headers = new ArrayList<Header>();
headers.add(header);
HttpClient client = HttpClients.custom().setDefaultHeaders(headers).build();
HttpGet get = new HttpGet("real REST API here"));
HttpResponse response = client.execute(get);
String json_string_response = EntityUtils.toString(response.getEntity());
和测试
protected static HttpClient mockHttpClient;
protected static HttpGet mockHttpGet;
protected static HttpResponse mockHttpResponse;
protected static StatusLine mockStatusLine;
protected static HttpEntity mockHttpEntity;
@BeforeClass
public static void setup() throws ClientProtocolException, IOException {
mockHttpGet = Mockito.mock(HttpGet.class);
mockHttpClient = Mockito.mock(HttpClient.class);
mockHttpResponse = Mockito.mock(HttpResponse.class);
mockStatusLine = Mockito.mock(StatusLine.class);
mockHttpEntity = Mockito.mock(HttpEntity.class);
Mockito.when(mockHttpClient.execute(Mockito.isA(HttpGet.class))).thenReturn(mockHttpResponse);
Mockito.when(mockHttpResponse.getStatusLine()).thenReturn(mockStatusLine);
Mockito.when(mockStatusLine.getStatusCode()).thenReturn(HttpStatus.SC_OK);
Mockito.when(mockHttpResponse.getEntity()).thenReturn(mockHttpEntity);
}
@Test
underTest = new UnderTest(initialize with fake API (api));
//Trigger method to test
这给了我一个错误:
java.net.UnknownHostException: api: nodename nor servname provided, or not known
为什么不像设置中那样模拟 'client.execute(get)'
调用?
你目前拥有的是:
mockHttpClient = Mockito.mock(HttpClient.class);
Mockito.when(mockHttpClient.execute(Mockito.isA(HttpGet.class))).thenReturn(mockHttpResponse)
所以有一个 mock 应该对 execute()
.
然后你有:
1) underTest = new UnderTest(initialize with fake API (api));
2) // Trigger method to test
问题是:您的设置中的第 1 行或第 2 行有问题。但是我们不能告诉你;因为您没有向我们提供该代码。
问题是:为了使您的 mock 对象可用,它需要被 [=23=使用 ]underTest不知何故。因此,当您以某种方式错误地执行 init 时,underTest 不会使用模拟的东西,而是一些 "real" 东西。