Ошибка java.lang.RuntimeException: заглушка!в Android с тестированием Fitnesse - PullRequest
24 голосов
/ 24 января 2012

Я пытаюсь создать тестовое устройство, используя Fitnesse framework, и я хочу протестировать функцию, которая извлекает данные с сервера (служба 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(), все работало нормально.Интересно, эта ошибка связана с выполнением длинной задачи в главном потоке?Есть идеи?

Ответы [ 3 ]

41 голосов
/ 24 января 2012

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

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

9 голосов
/ 21 июля 2013

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

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

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

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

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

5 голосов
/ 24 января 2012

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

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

...