web-dev-qa-db-ja.com

エラーJava.lang.RuntimeException:スタブ! in Android Fitnesseテスト付き

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()のような他のテスト方法を書きましたが、すべてうまくいきました。このエラーはメインスレッドで長いタスクを実行することを伴うのだろうか?何か案が?

24
Chan

Android.jarには、クラスのスタブ実装のみが含まれます。アプリをビルドする手段を提供します。APKを入手したら、Androidデバイスまたはエミュレーターで実行する必要があります。

私が間違っていなければ、ホストのJVMで実行しようとしています。

41

Roboelectric を使用すると、この問題を修正して、IDE内で簡単にテストできます。

Dtmilanoが言ったように、ラップトップでAndroidコードをそのまま実行することはできませんが、Roboelectricは基本的にAndroid.jarのスタブを実際のメソッド実装に置き換えます。

このソリューションを使用する場合は、次の2つの点に注意してください。

  • IntelliJを使用している場合は、JARインポートが依存関係リストのAndroid JARの上にあることを確認してください

  • サーバーの状態をどこかで実際に変更したくないという仮定の下で、デフォルトでHTTP要求をブロックします。ただし、これを非常に簡単に無効にすることができます。Roboelectric.getFakeHttpLayer()。interceptHttpRequests(false);

9
Alex

前に述べたように、Android jarsはコンパイル以上のものには適していません。ほとんどの罪のないものでも完全にスタブ化されます。しかし、ホストVM優れたモックフレームワークを使用した単体テスト。私の選択は jmockit

Fitnesseで動作するかどうかはわかりませんが

5