¿Cómo probar una unidad que usa HttpClient en Android usando el marco incorporado?
Tengo una clase:
public class WebReader implements IWebReader { HttpClient client; public WebReader() { client = new DefaultHttpClient(); } public WebReader(HttpClient httpClient) { client = httpClient; } /** * Reads the web resource at the specified path with the params given. * @param path Path of the resource to be read. * @param params Parameters needed to be transferred to the server using POST method. * @param compression If it's needed to use compression. Default is <b>true</b>. * @return <p>Returns the string got from the server. If there was an error downloading file, * an empty string is returned, the information about the error is written to the log file.</p> */ public String readWebResource(String path, ArrayList<BasicNameValuePair> params, Boolean compression) { HttpPost httpPost = new HttpPost(path); String result = ""; if (compression) httpPost.addHeader("Accept-Encoding", "gzip"); if (params.size() > 0){ try { httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } } try { HttpResponse response = client.execute(httpPost); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream content = entity.getContent(); if (entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding() .getValue())) result = uncompressInputStream(content); else result = convertStreamToString(content); } else { Log.e(MyApp.class.toString(), "Failed to download file"); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } private String uncompressInputStream(InputStream inputStream) throws IOException {...} private String convertStreamToString(InputStream is) {...} }
No puedo encontrar una manera de probarlo usando un marco estándar. Especialmente, necesito simular el Internet total perdido de dentro de la prueba.
- Mockito / Power Mockito: incapaz de obtener la salida esperada cuando el método de burla de LayoutParams en android
- Cómo emular onLowMemory ()?
- ¿Cómo burlar el método de Bundle en Android Unit-Test?
- Agregue ID de programación a R.id
- Prueba de unidad en Android Studio: error "no escarnecido"
Hay sugerencias para activar manualmente la Internet en el emulador durante la realización de la prueba. Pero me parece que no es una buena solución, porque las pruebas automáticas deben ser … automáticas.
He añadido un campo "cliente" a la clase tratando de burlarse de dentro de la clase de prueba. Pero la implementación de la interfaz HttpClient parece bastante compleja.
El marco Robolectric permite a los desarrolladores probar la conexión HTTP, por lo que sé. Pero supongo que hay alguna manera de escribir tal prueba sin usar un marco adicional tan grande.
¿Hay formas breves y sencillas de clases de prueba de unidades que usan HttpClient? ¿Cómo resolviste esto en tus proyectos?
- ¿Cómo puedo probar una unidad de Android que actúa en Acelerómetro?
- No se puede resolver la actividad para: Intención
- Android Test Case - ¿cómo ver la salida?
- No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
- Preguntas sobre la prueba de unidad Android con gradle o estudio de android
- Prueba de la unidad MVP de Android: ¿debo burlar el bus de eventos?
- Cómo probar la interacción simulada en Activity onResume () ¿Utilizando Dagger Modules y Robolectric?
- ¿Cómo puedo crear pruebas en Android Studio?
He añadido un campo "cliente" a la clase tratando de burlarse de dentro de la clase de prueba. Pero la implementación de la interfaz HttpClient parece bastante compleja.
Estoy un poco confundido acerca de esta declaración. Desde el título de la pregunta, usted está preguntando sobre la prueba de unidad httpClint, burlándose de un FakeHttpClient puede ayudarle a la unidad de pruebas de otra parte de la aplicación, excepto httpClient, pero no ayuda a nada para la prueba de unidades httpClient. Lo que usted necesita es un FakeHttpLayer para la unidad de prueba httpClient (no hay servidor remoto, la red requiere, por lo tanto, unidad de prueba).
HttpClient Dummy Test:
Si sólo necesita examinar el comportamiento de la aplicación en la situación en la que se pierde Internet, entonces una prueba de instrumento Android clásica es suficiente, puede activar por programación Internet en el emulador durante la realización de la prueba:
public void testWhenInternetOK() { ... ... webReader.readWebResource(); // expect HTTP 200 response. ... ... } public void testWhenInternetLost() { ... ... wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); wifiManager.setWifiEnabled(false); webReader.readWebResource(); // expect no HTTP response. ... ... }
Esto requiere que el servidor http remoto esté completamente configurado y en estado de funcionamiento, y siempre que ejecute la clase de prueba, una comunicación HTTP real se realiza a través de la red y se pulsa en el servidor http.
HttpClient Prueba Avanzada:
Si desea probar el comportamiento de la aplicación más precisamente, por ejemplo, desea probar una llamada http en su aplicación para ver si es manejar diferentes http respuesta correctamente. El Robolectric es la mejor opción. Puede utilizar FakeHttpLayer y burlarse de la solicitud de http y la respuesta a lo que quieras.
public void setup() { String url = "http://..."; // First http request fired in test, mock a HTTP 200 response (ContentType: application/json) HttpResponse response1 = new DefaultHttpResponseFactory().newHttpResponse(HttpVersion.HTTP_1_1, 200, null); BasicHttpEntity entity1 = new BasicHttpEntity(); entity1.setContentType("application/json"); response1.setEntity(entity1); // Second http request fired in test, mock a HTTP 404 response (ContentType: text/html) HttpResponse response2 = new DefaultHttpResponseFactory().newHttpResponse(HttpVersion.HTTP_1_1, 404, null); BasicHttpEntity entity2 = new BasicHttpEntity(); entity2.setContentType("text/html"); response2.setEntity(entity2); List<HttpResponse> responses = new ArrayList<HttpResponse>(); responses.add(response1); responses.add(response2); Robolectric.addHttpResponseRule(new FakeHttpLayer.UriRequestMatcher("POST", url), responses); } public void testFoo() { ... ... webReader.readWebResource(); // <- a call that perform a http post request to url. // expect HTTP 200 response. ... ... } public void testBar() { ... ... webReader.readWebResource(); // <- a call that perform a http post request to url. // expect HTTP 404 response. ... ... }
Algunos profesionales del uso de Robolectric son:
- Puramente prueba de JUnit, ninguna prueba del instrumento así que no necesita el emulador del comienzo (o el dispositivo verdadero) para funcionar la prueba, aumenta velocidad del desarrollo.
- La última línea de código de Robolectric para habilitar / deshabilitar FakeHttpLayer, donde puede configurar la solicitud http para que sea interpretada por FakeHttpLayer (no hay una llamada HTTP real a través de la red), o establecer la petición http para evitar la FakeHttpLayer (realizar la llamada HTTP real a través de la red). Consulte esta pregunta para obtener más detalles.
Si echa un vistazo a la fuente de Robolectric, puede ver que es bastante complejo implementar un FakeHtppLayer correctamente por usted mismo. Recomendaría utilizar el marco de prueba existente en lugar de implementar su propia API.
Espero que esto ayude.
- Android no puede ver los dispositivos en el dominio ".local"
- Cómo implementar añadir pie de página a petición a ListView al cargar datos