2017-02-09 103 views
1

我试图测试这种方法,检查超时设置是否正确。Apache HttpClient中的单元测试超时

public HttpClientBuilder getClientBuilderWithTimeouts(final int connT, final int reqT, final int socketT){ 
    RequestConfig.Builder requestBuilder = RequestConfig.custom(); 
    requestBuilder = requestBuilder.setConnectTimeout(connT); 
    requestBuilder = requestBuilder.setConnectionRequestTimeout(reqT); 
    requestBuilder = requestBuilder.setSocketTimeout(socketT); 
    HttpClientBuilder clientBuilder = HttpClientBuilder.create();  
    clientBuilder.setDefaultRequestConfig(requestBuilder.build()); 
    return clientBuilder; 
} 

在我的单元测试,虽然getParams()抛出UnsupportedOperationException。如何在不使用集成测试的情况下解决此问题?

import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClientBuilder; 
import org.apache.http.client.config.RequestConfig; 
... 

@Test 
public void testGetClientBuilderWithTimeouts(){ 

    HttpClientBuilder clBuilder = utils.getClientBuilderWithTimeouts(10, 20, 30); 
    CloseableHttpClient testclient = clBuilder.build(); 

    System.out.println(testclient.getParams().getParameter("http.socket.timeout")); 
    System.out.println(testclient.getParams().getParameter("http.connection.timeout")); 
    // asserts .. 
} 

回答

1

您可以尝试构建实际的客户端之前添加HttpRequestInterceptor,从utils的类获取客户端(要测试)后。

... 

import org.apache.http.HttpRequestInterceptor; 
import org.apache.http.client.config.RequestConfig; 
import org.apache.http.client.protocol.HttpClientContext; 
import org.apache.http.protocol.HttpContext; 
import org.apache.http.HttpRequest; 
import org.apache.http.HttpException; 

... 

builder.addInterceptorFirst(new HttpRequestInterceptor() { 

     @Override 
     public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { 
     // Get hold of the client context, which holds the request config 
     RequestConfig requestConfig = HttpClientContext.adapt(context).getRequestConfig(); 

     assertEquals(10, requestConfig.getConnectTimeout()); 
     assertEquals(20, requestConfig.getConnectionRequestTimeout()); 
     assertEquals(30, requestConfig.getSocketTimeout()); 
     } 
    });  

现在只需调用任何URL并忽略客户端将抛出的异常以防万一URL请求失败。由于拦截器是作为第一个添加的,并且是请求拦截器,因此应该在尝试请求之前调用拦截器,为您提供请求配置以断言。

+0

谢谢你,试试吧! –

+1

也许向apache-httpclient打开一个拉取请求,让构建者公开配置属性的值;) –