![](/img/trans.png)
[英]Android+Robolectric Test ERROR “java.lang.RuntimeException: Stub!”
[英]Error java.lang.RuntimeException: Stub! in Android with Fitnesse testing
我正在嘗試使用Fitnesse
框架創建一個測試裝置,並且我想測試一個從服務器(RESTFUL 服務)檢索數據的函數。 我的測試用例非常簡單:
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
測試頁面:!path 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()
,一切正常。 我想知道這個錯誤是否涉及在主線程上運行一個長任務? 任何的想法?
android.jar
只包含類的存根實現。 它為您提供了構建應用程序的方法,一旦您擁有 APK,您必須在 Android 設備或模擬器上運行它。
如果我沒猜錯,您正試圖在主機的 JVM 上運行。
您可以使用Roboelectric輕松解決此問題並在您的 IDE 中進行測試。
正如 dtmilano 所說,您不能在筆記本電腦上按原樣運行 Android 代碼,但 Roboelectric 基本上用實際的方法實現替代了 Android.jar 中的存根。
如果您使用此解決方案,需要注意兩件事:
如果使用 IntelliJ,請確保您的 JAR 導入位於依賴項列表中的 Android JAR 上方
它默認阻止 HTTP 請求,前提是您實際上不想在某處更改服務器的狀態。 但是,您可以很容易地禁用它: Roboelectric.getFakeHttpLayer().interceptHttpRequests(false);
如前所述,除了編譯之外,Android jar
對任何事情都沒有好處。 即使是最無辜的事情也被徹底扼殺了。 但是您仍然可以在具有良好模擬框架的主機 VM 單元測試中使用它們。 我的選擇是jmockit
:
不確定它是否適用於 Fitnesse
由於“靜態”聲明,我遇到了同樣的問題。 就我而言, .build() 導致了靜態變量中的問題。 簡單的解決方案是不將變量聲明為靜態。 它可以是最終的。 嘗試從 getJsonArrayFromUrl 方法中刪除“靜態”,看看它是否有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.