代码之家  ›  专栏  ›  技术社区  ›  kwarter

如何模拟RestTemplate代理调用?

  •  0
  • kwarter  · 技术社区  · 1 年前

    我有一个集成测试,它可以正确地模拟身份验证调用,但现在需要支持代理。我对代理没有经验,在测试这方面遇到了很多困难。

    具体实施情况如下:

    proxySettings.setProxy(httpClientBuilder, null);
    RestTemplate restTemplate = new RestTemplate(
        new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build()));
    
    ...
    
    restTemplate.exchange(url, HttpMethod.POST, entity, type);
    

    这个 setProxy() 方法获取一些用户配置的代理设置,并将它们应用于 HttpClientBuilder :

    //Fetch user-configured proxy settings and null check before returning object
    HttpHost proxyHttpHost = getHttpClientProxyHttpHost();
    
    httpClientBuilder.setProxy(proxyHttpHost);
    
    //If user/pass is set (credentialsProvider is just a new instance of BasicCredentialsProvider)
    credentialsProvider.setCredentials(
        new AuthScope(getHttpProxyHost(), Integer.parseInt(getHttpProxyPort())),
        proxyUsernamePasswordCredentials
    );
    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
    

    非代理版本的测试通过了以下预期:

    expect().when(
        request()
            .withMethod("POST")
            .withPath("/auth")
            .withBody(
                params(
                    param("client_id", clientId),
                    param("client_secret", clientSecret),
                    param("grant_type", grantType),
                    param("scope", scope)
                ))
    ).respond(
        response()
            .withStatusCode(expectedResponseStatusCode)
            .withContentType(MediaType.APPLICATION_JSON)
            .withBody(json("{\"access_token\":\"ImAHappyString\"}"))
    );
    

    当我在配置了代理的情况下运行测试时(主机: proxy-host.com 港口城市 1234 )我得到以下错误:

    ErrorMessage: I/O error on POST request for "http://127.0.0.1:37351/auth": proxy-host.com: Name or service not known; nested exception is java.net.UnknownHostException: proxy-host.com: Name or service not known
    

    我试着期待一个 CONNECT 请求,但我只是得到了同样的失败。有什么建议吗?

    0 回复  |  直到 1 年前