0

I know how to mock a default HttpClient, but how do I mock the latest (v4.4) HttpClient that is created using a PoolingHttpClientConnectionManager with Mockito?

My code looks like this:

PoolingHttpClientConnectionManager mgr = new PoolingHttpClientConnectionManager();
...
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(mgr).build();
HttpResponse response = httpClient.execute(request);            
... // here I want to substitute a mocked HttpResponse
Community
  • 1
  • 1
rustyx
  • 80,671
  • 25
  • 200
  • 267

2 Answers2

1

It is likely to be easier to mock out HttpRequestExecutor than HttpClientConnection. You would still need to provide a no-op implementation of HttpClientConnectionManager in order to prevent HttpClient from creating and connecting sockets

HttpRequestExecutor requestExecutor = Mockito.mock(HttpRequestExecutor.class);
Mockito.when(requestExecutor.execute(
        Mockito.<HttpRequest>any(),
        Mockito.<HttpClientConnection>any(),
        Mockito.<HttpContext>any())).thenReturn(new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "Hah"));

HttpClientConnectionManager cm = Mockito.mock(HttpClientConnectionManager.class);
HttpClientConnection conn = Mockito.mock(HttpClientConnection.class);
ConnectionRequest connRequest = Mockito.mock(ConnectionRequest.class);
Mockito.when(cm.requestConnection(
        Mockito.<HttpRoute>any(),
        Mockito.any())).thenReturn(connRequest);
Mockito.when(connRequest.get(
        Mockito.anyLong(),
        Mockito.<TimeUnit>any())).thenReturn(conn);

CloseableHttpClient client = HttpClients.custom()
        .setRequestExecutor(requestExecutor)
        .setConnectionManager(cm)
        .build();

CloseableHttpResponse response = client.execute(new HttpGet("http://pampa/"));
try {
    System.out.println(response.getStatusLine());
} finally {
    response.close();
}
ok2c
  • 26,450
  • 5
  • 63
  • 71
  • Wow, was hoping there would be less mocking involved :) But fortunately after some refactoring I'm able to mock just the `HttpClient` as before. – rustyx Apr 05 '15 at 19:36
1

Just realized that PoolingHttpClientConnectionManager is the default connection manager used by HttpClient built with HttpClients.custom().build() (at least in v4.4), so I just went back to mocking the HttpClient.

protected HttpClient buildHttpClient() {
    return HttpClients.custom()./* other config */.build();
}

unit test code:

    @Mock
    HttpClient mockClient;
    @Mock
    HttpResponse mockResponse;
    @Spy
    MyClass myclass = new MyClass();
    . . .
    @Test
    public void myTestCase() {
        . . .
        when(myclass.buildHttpClient()).thenReturn(mockClient);
        when(mockClient.execute(requestCaptor.capture())).thenReturn(mockResponse);
        . . .
rustyx
  • 80,671
  • 25
  • 200
  • 267