web-dev-qa-db-fra.com

Erreur Java.lang.RuntimeException: Stub! dans Android avec test Fitnesse

J'essaie de créer un appareil de test en utilisant le framework Fitnesse, et je veux tester une fonction qui récupère les données d'un serveur (service RESTFUL). Mon cas de test est très simple:

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;
    }

Et voici la page de test 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"|

Comme c'est juste une démo, mon test peut sembler un peu idiot en ce moment. Malheureusement, je continue à recevoir ces erreurs:

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)

Et je n'ai aucune idée de ce que ça me dit? J'ai écrit une autre méthode de test comme add(), substract(), tout fonctionnait bien. Je me demande si cette erreur implique d'exécuter une longue tâche sur le thread principal? Une idée?

24
Chan

Android.jar contient uniquement l'implémentation de stub des classes. Il fournit les moyens de créer votre application, une fois que vous avez votre APK, vous devez l'exécuter sur un appareil ou un émulateur Android Android).

Si je ne me trompe pas, vous essayez d'exécuter sur la machine virtuelle Java de l'hôte.

41
Diego Torres Milano

Vous pouvez résoudre ce problème et tester dans votre IDE très facilement en utilisant Roboelectric .

Comme l'a dit dtmilano, vous ne pouvez pas exécuter le code Android sur votre ordinateur portable tel quel, mais Roboelectric remplace essentiellement les implémentations de méthode réelles pour les stubs dans Android.jar.

Deux choses à surveiller si vous optez pour cette solution:

  • Assurez-vous que votre import JAR est au-dessus du Android JAR dans votre liste de dépendances si vous utilisez IntelliJ

  • Par défaut, il bloque les requêtes HTTP sous l'hypothèse que vous ne voulez pas réellement changer l'état d'un serveur quelque part. Vous pouvez cependant désactiver cela assez facilement: Roboelectric.getFakeHttpLayer (). InterceptHttpRequests (false);

9
Alex

Comme mentionné précédemment, Android jars ne sont pas bons pour autre chose que la compilation. Même la plupart des choses innocentes sont complètement bloquées. Mais vous pouvez toujours les utiliser dans Host VM tests unitaires avec de bons frameworks de simulation. Mon choix est jmockit :

Je ne sais pas si cela fonctionnera avec Fitnesse

5
Konstantin Pribluda