2012-01-24 33 views
20

我想創建一個使用Fitnesse框架的測試夾具,並且我想測試一個從服務器(RESTFUL服務)中檢索數據的函數。我的測試用例是很簡單的:錯誤java.lang.RuntimeException:存根!在Android與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; 
    } 

這裏是Fitnesse測試頁:路徑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"| 

因爲它只是一個演示,我的測試可能看起來在此刻有點傻。不幸的是,我不斷收到這些錯誤:

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) 

而且我不知道它告訴我什麼?我寫了其他測試方法,如add(), substract(),一切正常。我想知道這個錯誤是否涉及在主線程上運行一個很長的任務?任何想法?

回答

36

android.jar只包含類的存根實現。它爲應用程序構建提供了手段,一旦你有了APK,你就必須在Android設備或模擬器上運行它。

如果我沒看錯你嘗試在主機的JVM上運行。

+0

謝謝,我的測試夾具類不包含任何活動代碼,所以我不明白爲什麼我必須在設備上運行它。無論如何,讓我試試它在設備上運行。 – Chan

+1

即使我在手機上運行它也會出現同樣的錯誤。任何解決方法? – Chan

+0

你有androud.util.Log –

4

正如前面提到的,Android的jar s爲不利於超越編譯任何東西。甚至大多數無辜的東西都被徹底剔除。但是您仍然可以在具有良好模擬框架的主機VM單元測試中使用它們。我的選擇是jmockit

不能確定它是否會利用Roboelectric與FitNesse的工作,雖然

+1

非常感謝這個例子。不過,我仍然認爲Fitnesse是一種更好的編寫測試的方法,因爲它很容易記錄。 – Chan

+1

...但測試功能仍然很重要。它可能與嘲笑框架兼容 –

9

您可以修復你的IDE中的這個問題,測試真的很容易。

正如dtmilano說,你不能在你的筆記本電腦運行Android代碼原樣,但Roboelectric基本上代替實際的方法實現對的android.jar存根。

有兩點需要注意,如果你去這個解決方案:

  • 確保您的JAR導入依附功能清單中了Android JAR以上,如果使用的是IntelliJ

  • 它默認在假設你不想改變某個服務器的狀態的情況下阻止HTTP請求。但是,您可以很容易地禁用它:Roboelectric.getFakeHttpLayer()。interceptHttpRequests(false);

相關問題