Подтвердить что ты не робот

Ошибка java.lang.RuntimeException: Stub! в Android с тестированием Fitnesse

Я пытаюсь создать тестовое устройство с использованием инфраструктуры Fitnesse, и я хочу протестировать функцию, которая извлекает данные с сервера (RESTFUL service). Мой тестовый пример очень прост:

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(), все работало нормально. Интересно, эта ошибка включает выполнение длинной задачи в основном потоке? Любая идея?

4b9b3361

Ответ 1

android.jar содержит только тупиковую реализацию классов. Он предоставляет средства для создания вашего приложения, как только у вас есть APK, вы должны запустить его на устройстве или эмуляторе Android.

Если я не ошибаюсь, вы пытаетесь запустить на хосте JVM.

Ответ 2

Вы можете устранить эту проблему и протестировать в своей среде IDE очень легко, используя Roboelectric.

Как сказал dtmilano, вы не можете запускать код Android на своем ноутбуке, как есть, но Roboelectric в основном заменяет фактические реализации методов для заглушек в Android.jar.

Две вещи, которые следует учитывать, если вы пойдете с этим решением:

  • Убедитесь, что ваш JAR-импорт находится выше Android JAR в вашем списке зависимостей, если вы используете IntelliJ

  • По умолчанию он блокирует HTTP-запросы в предположении, что вы на самом деле не хотите каким-либо образом изменять состояние сервера. Вы можете, однако, отключить это довольно легко: Roboelectric.getFakeHttpLayer(). InterceptHttpRequests (false);

Ответ 3

Как уже упоминалось ранее, Android jar не подходит ни для чего, кроме компиляции. Даже самые невинные вещи полностью вычеркнуты. Но вы все равно можете использовать их в модульных тестах хоста VM с хорошими издевательскими фреймворками. Мой выбор jmockit:

Не уверен, будет ли он работать с Fitnesse, хотя