java - Apache HttpClient 中的单元测试超时

标签 java testing apache-httpclient-4.x

我正在尝试测试此方法以检查超时设置是否正确。

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 ..
}

最佳答案

您可以尝试在构建实际客户端之前添加一个 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 的请求失败。由于拦截器是第一个添加的并且是一个请求拦截器,因此应该在尝试请求之前调用它,为您提供要断言的请求配置。

关于java - Apache HttpClient 中的单元测试超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145582/

相关文章:

java - 如何在apache异步http客户端中设置重定向策略

java - 我怎样才能在java中修复这个星星金字塔

java - 使用 POI 将大型结果集写入 Excel 文件

.Net Web 应用程序问题中的 Java Applet

node.js - 从testcafe发送html报告的邮件,如何实现?

java - Apache HttpClient、User-Agent 和企业代理

Java时区格式问题

unit-testing - 用于测试的库是否包含在最终构建中

ruby-on-rails - 是否可以验证为使用 Rails 集成测试设置了 cookie 的域?

java - Apache HttpClient : how to get redirect locations when using Fluent API?