2012-01-24 11 views
20

Próbuję stworzyć urządzenie testowe przy użyciu szkieletu Fitnesse i chcę przetestować funkcję, która pobiera dane z serwera (usługa RESTFUL). Mój przypadek Test jest bardzo prosty:Błąd java.lang.RuntimeException: Stub! w Androidzie z testowaniem 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; 
    } 

A oto strona Fitnesse Test: ścieżka 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"| 

Ponieważ jest to tylko demo, moja próba może wyglądać nieco głupie w tej chwili . Niestety, ciągle dostaję te błędy:

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) 

I nie mam pojęcia, co mi mówi? Napisałem inną metodę testowania, taką jak add(), substract(), wszystko działało dobrze. Zastanawiam się, czy ten błąd polega na uruchomieniu długiego zadania na głównym wątku? Dowolny pomysł?

Odpowiedz

36

android.jar zawiera tylko krótką implementację klas. Zapewnia środki do budowania aplikacji, gdy już masz swój pakiet APK, musisz go uruchomić na urządzeniu z Androidem lub emulatorze.

Jeśli się nie mylę, próbujesz uruchomić maszynę JVM hosta.

+0

Dzięki temu moja klasa urządzeń testowych nie zawiera żadnego kodu aktywności, więc nie rozumiem, dlaczego muszę go uruchomić na urządzeniu. W każdym razie, pozwól mi spróbować uruchomić go na urządzeniu. – Chan

+1

Ten sam błąd, nawet jeśli uruchomiłem go na moim telefonie. Jakiekolwiek obejście? – Chan

+0

masz androud.util.Log –

4

Jak wspomniano wcześniej, Android jar s nie nadaje się do niczego poza kompilacją. Nawet najbardziej niewinne rzeczy są całkowicie zgaszone. Ale nadal można ich używać w testach jednostkowych VM hosta z dobrymi frameworkami. Mój wybór jest jmockit:

Nie jestem pewien, czy to będzie działać z Fitnesse chociaż

+1

Wielkie dzięki za przykład. Jednak nadal uważam, że Fitnesse jest lepszym sposobem na napisanie testu, ponieważ łatwiej jest dokumentować po drodze. – Chan

+1

... ale funkcja testu jest nadal ważna. I może równie dobrze pasować do szyderczych frameworków –

9

Można rozwiązać ten problem i wykonaj test w swoim IDE bardzo łatwo za pomocą Roboelectric.

Zgodnie z tym, co powiedział dtmilano, nie można uruchomić kodu Android na swoim laptopie tak, jak jest, ale Roboelectric zasadniczo zastępuje rzeczywiste implementacje metod dla kodów pośredniczących w pliku Android.jar.

dwie rzeczy, na które trzeba uważać jeśli się z tego rozwiązania:

  • upewnić się, że import JAR jest powyżej Android JAR na liście zależności, gdy przy użyciu IntelliJ

  • It domyślnie blokowanie żądań HTTP przy założeniu, że nie chcesz gdzieś zmieniać stanu serwera. Możesz jednak wyłączyć to dość łatwo: Roboelectric.getFakeHttpLayer(). InterceptHttpRequests (false);

Powiązane problemy