2012-01-24 11 views
20

Sto provando a creare un dispositivo di prova utilizzando il framework Fitnesse e voglio testare una funzione che recupera i dati da un server (servizio RESTFUL). Il mio banco di prova è molto semplice:Errore java.lang.RuntimeException: Stub! in Android con Test 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; 
    } 

E qui è la pagina Fitnesse di prova: percorso 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"| 

Dal momento che è solo una demo, la mia prova potrebbe sembrare un po 'sciocco in questo momento . Sfortunatamente continuo a ricevere questi errori:

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) 

E non ho idea di cosa mi stia dicendo? Ho scritto altri metodi di prova come add(), substract(), tutto ha funzionato bene. Mi chiedo, questo errore comporta l'esecuzione di una lunga attività sul thread principale? Qualche idea?

risposta

36

android.jar contiene solo l'implementazione di stub delle classi. Fornisce i mezzi per la tua app da compilare, una volta che hai l'APK devi eseguirlo su un dispositivo o emulatore Android.

Se non sbaglio, stai tentando di eseguire sulla JVM dell'host.

+0

Grazie, la mia classe di apparecchio di prova non contiene alcun codice attività, quindi non capisco perché devo eseguirlo sul dispositivo. Ad ogni modo, fammi provare a farlo funzionare sul dispositivo. – Chan

+1

Lo stesso errore anche se l'ho eseguito sul mio telefono. Qualche soluzione? – Chan

+0

hai androud.util.Log –

4

Come accennato in precedenza, Android jar s non va bene per qualcosa oltre la compilazione. Anche la maggior parte delle cose innocenti sono completamente cancellate. Ma è ancora possibile utilizzarli nei test di unità VM host con buoni framework di simulazione. La mia scelta è jmockit:

Non è sicuro se che possa funzionare con Fitnesse se

+1

Molte grazie per l'esempio. Tuttavia, continuo a pensare che Fitnesse sia un modo migliore per scrivere test, dal momento che è più facile documentare lungo la strada. – Chan

+1

... ma la funzionalità di test è ancora importante. E potrebbe anche essere compatibile con strutture di derisione –

9

È possibile risolvere questo problema e di prova all'interno del vostro IDE davvero facilmente utilizzando Roboelectric.

Come diceva dtmilano, non è possibile eseguire il codice Android sul laptop così com'è, ma Roboelectric sostituisce sostanzialmente le implementazioni del metodo effettivo per gli stub in Android.jar.

due cose a cui fare attenzione se si va con questa soluzione:

  • Assicurarsi che il JAR di importazione è al di sopra della JAR Android nella vostra lista delle dipendenze se si utilizza IntelliJ

  • Il valore predefinito per bloccando le richieste HTTP supponendo che in realtà non si voglia modificare lo stato di un server da qualche parte. Tuttavia, è possibile disabilitarlo abbastanza facilmente: Roboelectric.getFakeHttpLayer(). IntercceptHttpRequests (false);

Problemi correlati