¿Cómo puedo crear un CloseableHttpResponse objeto de ayudar a los ensayos?

Estoy tratando de construir un CloseableHttpResponse objeto mock para ser devueltos en una de mis pruebas de unidad, pero no hay ningún constructor. He encontrado este DefaultHttpResponseFactory, pero sólo hace un HttpResponse. Lo que es una manera simple de construir un CloseableHttpResponse? Necesito llamar a execute() en mi prueba y, a continuación, establezca el statusLine y entity? Que parece un extraño enfoque.

Aquí el método que estoy tratando de burlarse de:

public static CloseableHttpResponse getViaProxy(String url, String ip, int port, String username,
                                                String password) {
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(
            new AuthScope(ip, port),
            new UsernamePasswordCredentials(username, password));
    CloseableHttpClient httpclient = HttpClients.custom()
            .setDefaultCredentialsProvider(credsProvider).build();
    try {
        RequestConfig config = RequestConfig.custom()
                .setProxy(new HttpHost(ip, port))
                .build();
        HttpGet httpGet = new HttpGet(url);
        httpGet.setConfig(config);

        LOGGER.info("executing request: " + httpGet.getRequestLine() + " via proxy ip: " + ip + " port: " + port +
                " username: " + username + " password: " + password);

        CloseableHttpResponse response = null;
        try {
            return httpclient.execute(httpGet);
        } catch (Exception e) {
            throw new RuntimeException("Could not GET with " + url + " via proxy ip: " + ip + " port: " + port +
                    " username: " + username + " password: " + password, e);
        } finally {
            try {
                response.close();
            } catch (Exception e) {
                throw new RuntimeException("Could not close response", e);
            }
        }
    } finally {
        try {
            httpclient.close();
        } catch (Exception e) {
            throw new RuntimeException("Could not close httpclient", e);
        }
    }
}

Aquí está el simulacro de código mediante el uso de PowerMockito:

    mockStatic(HttpUtils.class);
    when(HttpUtils.getViaProxy("http://www.google.com", anyString(), anyInt(), anyString(), anyString()).thenReturn(/*mockedCloseableHttpResponseObject goes here*/)

OriginalEl autor Popcorn | 2013-11-07

4 Kommentare

  1. 24

    Siga estos pasos pueden ayudar:

    1.burlarse de ella (ex. mockito)

    CloseableHttpResponse response = mock(CloseableHttpResponse.class);
    HttpEntity entity = mock(HttpEntity.class);

    2.se aplican algunas reglas

    when(response.getStatusLine()).thenReturn(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "FINE!"));
    when(entity.getContent()).thenReturn(getClass().getClassLoader().getResourceAsStream("result.txt"));
    when(response.getEntity()).thenReturn(entity);

    3.utilizar

    when(httpClient.execute((HttpGet) any())).thenReturn(response);

    OriginalEl autor

  2. 1

    Quería crear un hormigón CloseableHttpResponse más que un simulacro, también, así que me guié por el servidor HTTP Apache cliente de código fuente.

    En MainClientExec, todos los valores de retorno de ejecutar aspecto:

    return new HttpResponseProxy(response, connHolder);

    donde connHolder puede ser null.

    HttpResponseProxy es sólo un envoltorio que hace un cierre en la connHolder. Por desgracia, es un paquete protegido, por lo que no es (necesariamente) visible.

    Yo lo que hice fue crear un «PublicHttpResponseProxy»

    package org.apache.http.impl.execchain;
    
    import org.apache.http.HttpResponse;
    
    public class PublicHttpResponseProxy extends HttpResponseProxy {
    
        public PublicHttpResponseProxy(HttpResponse original) {
            super(original, null);
        }
    }

    Debe estar en el paquete «org.apache.http.impl.execchain» (!) Básicamente golpes de la visibilidad pública y proporcionar un constructor con conexión null controlador.

    Ahora puedo crear una instancia de un hormigón CloseableHttpResponse con

    CloseableHttpResponse response = new PublicHttpResponseProxy(basicResponse);

    Las habituales advertencias se aplican. Puesto que el proxy es un paquete protegido, no es una parte de la API oficial, así que usted puede rodar los dados que no estará disponible más adelante. Por otro lado, no hay mucho a ella, por lo que fácilmente podría simplemente escribir su propia versión de la misma. Habría algunas cortar-y-pegar, pero no sería tan malo.

    OriginalEl autor Rob

  3. 1

    Ha sido un tiempo desde que esta pregunta se ha hecho, pero yo quiero darle una solución que se usa.

    He creado una pequeña clase que herede de la BasicHttpResponse clase e implementa el CloseableHttpResponse interfaz (que no tiene nada, sino un método para cerrar la respuesta). Desde el BasicHttpResponse clase contiene métodos setter para casi todo, puedo configurar todos los campos que necesita con el siguiente fragmento de código:

    public static CloseableHttpResponse buildMockResponse() throws FileNotFoundException {
        ProtocolVersion protocolVersion = new ProtocolVersion("HTTP", 1, 1);
        String reasonPhrase = "OK";
        StatusLine statusline = new BasicStatusLine(protocolVersion, HttpStatus.SC_OK, reasonPhrase);
        MockCloseableHttpResponse mockResponse = new MockCloseableHttpResponse(statusline);
        BasicHttpEntity entity = new BasicHttpEntity();
        URL url = Thread.currentThread().getContextClassLoader().getResource("response.txt");
        InputStream instream = new FileInputStream(new File(url.getPath()));
        entity.setContent(instream);
        mockResponse.setEntity(entity);
        return mockResponse;
    }

    Yo, básicamente, de configurar todos los campos, que son utilizados por el código real. Esto también incluye la lectura de un simulacro de respuesta el contenido de un archivo en un arroyo.

    OriginalEl autor superM

  4. 0

    nvm, terminé la piratería mediante el uso de execute():

    private CloseableHttpResponse getMockClosesableHttpResponse(HttpResponse response) throws Exception {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse closeableHttpResponse = httpClient.execute(new HttpGet("http://www.test.com"));
        closeableHttpResponse.setEntity(response.getEntity());
        closeableHttpResponse.setStatusLine(response.getStatusLine());
        return closeableHttpResponse;
    }
    No se que descargar una copia nueva de http://www.test.com cada vez que se llame al método? Suena como una PITA de espera para morder.

    OriginalEl autor Popcorn

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea