首页 文章

模拟Apache HttpClient 4.4 PoolingHttpClientConnectionManager

提问于
浏览
0

我知道如何模拟default HttpClient,但是我如何模拟使用带有Mockito的PoolingHttpClientConnectionManager创建的最新(v4.4)HttpClient?

我的代码看起来像这样:

PoolingHttpClientConnectionManager mgr = new PoolingHttpClientConnectionManager();
...
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(mgr).build();
HttpResponse response = httpClient.execute(request);            
... // here I want to substitute a mocked HttpResponse

2 回答

  • 1

    模仿 HttpRequestExecutor 可能比 HttpClientConnection 更容易 . 您仍然需要提供 HttpClientConnectionManager 的无操作实现,以防止HttpClient创建和连接套接字

    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();
    }
    
  • 1

    刚刚意识到 PoolingHttpClientConnectionManagerHttpClient 使用 HttpClients.custom().build() (至少在v4.4中)使用的默认连接管理器,所以我回过头来嘲笑 HttpClient .

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

    单元测试代码:

    @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);
            . . .
    

相关问题