2012-01-24 24 views
20

Estoy tratando de crear un dispositivo de prueba utilizando el marco Fitnesse, y quiero probar una función que recupera datos de un servidor (servicio RESTFUL). Mi caso de prueba es muy simple:Error java.lang.RuntimeException: Stub! en Android con pruebas de Fitnesse

public class FriendListActivityFixture extends ColumnFixture { 
    public int URL; 
    public String test() { 
    JSONArray array = JsonHelper.getJsonArrayFromUrl("http://107.22.209.62/android/get_users.php"); 
    return array.toString(); 
    } 
} 

public static JSONArray getJsonArrayFromUrl(String url) { 
     InputStream input = null; 
     String result = ""; 
     JSONArray jsonArray = null; 
     try { 
      HttpClient httpclient = CustomHttpClient.getHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      input = entity.getContent(); 
     } 
     catch (Exception e) { 
      Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error in http connection " + e.toString()); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(input, "iso-8859-1"), 8); 
      StringBuilder content = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       content.append(line + "\n"); 
      } 
      input.close(); 
      result = content.toString(); 
     } 
     catch (Exception e) { 
      Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error parsing result " + e.toString()); 
     } 

     try { 
      jsonArray = new JSONArray(result); 
     } 
     catch (JSONException e) { 
      Log.e(TAG + "getJsonArrayFromUrl(String url)", "Error converting data " + e.toString()); 
     } 
     return jsonArray; 
    } 

Y aquí está la página Fitnesse prueba: ruta fitnesse.jar

!path C:\Program Files (x86)\Android\android-sdk\platforms\android-10\android.jar 
!path C:\Users\chan\git\Spotr\Spotr\bin\classes 

!|com.csun.spotr.fitnesse.FriendListActivityFixture| 
|URL|test?| 
|0|"wwa"| 

ya que es sólo una demo, mi prueba puede parecer un poco tonto en este momento . Lamentablemente, sigo recibiendo estos errores:

java.lang.RuntimeException: Stub! 
    at android.util.Log.e(Log.java:15) 
    at com.csun.spotr.util.JsonHelper.getJsonArrayFromUrl(JsonHelper.java:75) 
    at com.csun.spotr.fitnesse.FriendListActivityFixture.test(FriendListActivityFixture.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at fit.TypeAdapter.invoke(TypeAdapter.java:109) 
    at fit.TypeAdapter.get(TypeAdapter.java:97) 
    at fit.Fixture$CellComparator.compareCellToResult(Fixture.java:371) 
    at fit.Fixture$CellComparator.access$100(Fixture.java:357) 
    at fit.Fixture.compareCellToResult(Fixture.java:299) 
    at fit.Fixture.check(Fixture.java:295) 
    at fit.ColumnFixture.check(ColumnFixture.java:51) 
    at fit.Binding$QueryBinding.doCell(Binding.java:215) 
    at fit.ColumnFixture.doCell(ColumnFixture.java:37) 
    at fit.Fixture.doCells(Fixture.java:171) 
    at fit.Fixture.doRow(Fixture.java:165) 
    at fit.ColumnFixture.doRow(ColumnFixture.java:25) 
    at fit.Fixture.doRows(Fixture.java:159) 
    at fit.ColumnFixture.doRows(ColumnFixture.java:18) 
    at fit.Fixture.doTable(Fixture.java:153) 
    at fit.Fixture.interpretTables(Fixture.java:99) 
    at fit.Fixture.doTables(Fixture.java:79) 
    at fit.FitServer.process(FitServer.java:81) 
    at fit.FitServer.run(FitServer.java:56) 
    at fit.FitServer.main(FitServer.java:41) 

Y no tengo idea de qué me dice? Escribí otro método de prueba como add(), substract(), todo funcionó bien. Me pregunto si este error implica ejecutar una tarea larga en el hilo principal. ¿Alguna idea?

Respuesta

36

android.jar contiene solo la implementación del apéndice de las clases. Proporciona los medios para que tu aplicación cree, una vez que tienes tu APK debes ejecutarlo en un dispositivo Android o emulador.

Si no me equivoco, está intentando ejecutar en la JVM del host.

+0

Gracias, la clase de mi dispositivo de prueba no contiene ningún código de actividad, así que no entiendo por qué tengo que ejecutarlo en el dispositivo. De todos modos, déjame intentarlo ejecutarlo en el dispositivo. – Chan

+1

Mismo error incluso si lo ejecuté en mi teléfono. Cualquier solución? – Chan

+0

tienes androud.util.Log –

4

Como se mencionó anteriormente, Android jar s no son buenos para nada más que compilar. Incluso la mayoría de las cosas inocentes son apagadas por completo. Pero aún puede usarlos en las pruebas de la unidad VM de host con buenos marcos de burla. Mi elección es jmockit:

No está seguro de si va a trabajar con Fitnesse aunque

+1

Muchas gracias por el ejemplo. Sin embargo, todavía creo que Fitnesse es una mejor forma de escribir una prueba, ya que es más fácil documentarlo en el camino. – Chan

+1

... pero la funcionalidad de prueba sigue siendo importante. Y también puede ser compatible con marcos de burla –

9

Puede solucionar este problema y prueba dentro de su IDE muy fácilmente mediante el uso Roboelectric.

Como dijo dtmilano, no se puede ejecutar el código de Android en su computadora portátil como está, pero Roboelectric básicamente sustituye las implementaciones de métodos reales para los stubs en Android.jar.

Dos cosas a tener en cuenta si vas con esta solución:

  • Asegúrese de que su importación JAR está por encima del JAR Android en su lista de dependencias si se utiliza IntelliJ

  • Su valor predeterminado bloqueando solicitudes HTTP bajo la suposición de que en realidad no quiere cambiar el estado de un servidor en alguna parte. Sin embargo, puede desactivar esto bastante fácilmente: Roboelectric.getFakeHttpLayer(). InterceptHttpRequests (false);

Cuestiones relacionadas