【问题标题】:Mocking Apache HttpClient 4.4 PoolingHttpClientConnectionManager模拟 Apache HttpClient 4.4 PoolingHttpClientConnectionManager
【发布时间】:2015-03-12 14:09:24
【问题描述】:

我知道如何模拟 default HttpClient,但如何模拟使用 PoolingHttpClientConnectionManager 和 Mockito 创建的最新 (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

【问题讨论】:

    标签: java mockito apache-httpclient-4.x


    【解决方案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();
    }
    

    【讨论】:

    • 哇,希望少一些嘲弄 :) 但幸运的是,经过一些重构后,我能够像以前一样只模拟 HttpClient
    【解决方案2】:

    刚刚意识到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);
            . . .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多