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

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?

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.

  • Cómo probar la unidad android y burlarse de un método estático
  • Cómo burlar un objeto inyectado que no se declara en el módulo?
  • Ejecute UiAutomator API desde Android Studio (v0.8)
  • Android Gradle Conflicto de dependencia con la versión interna proporcionada por Android
  • ¿Cómo puedo obtener Mockito trabajando en androidTest
  • Cómo probar esta línea de LayoutInflater.from () en android
  • El uso de InstrumentationTestRunner personalizado en Eclipse provoca un error
  • Prueba de la excepción ClassNotFound
  • ¿Ejecutar pruebas de unidad android desde la línea de comandos?
  • Unidad de prueba Java clase que carga la biblioteca nativa
  • Unidad de prueba de funciones privadas en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.