簡體   English   中英

錯誤 java.lang.RuntimeException:存根! 在 Android 中進行 Fitnesse 測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM