错误java.lang.RuntimeException:Stub!在Android中进行Fitnesse测试

Cha*_*han 26 testing rest android http 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;
    }
Run Code Online (Sandbox Code Playgroud)

这是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"|
Run Code Online (Sandbox Code Playgroud)

由于它只是一个演示,我的测试目前可能看起来有点傻.不幸的是,我一直收到这些错误:

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)
Run Code Online (Sandbox Code Playgroud)

我不知道它告诉我什么?我写了其他测试方法add(), substract(),一切正常.我想知道这个错误是否涉及在主线程上运行一个长任务?任何的想法?

Die*_*ano 42

android.jar仅包含类的存根实现.它为您的应用程序提供了构建的方法,一旦您拥有APK,您必须在Android设备或模拟器上运行它.

如果我没错,你试图在主机的JVM上运行.


Ale*_*lex 9

您可以使用Roboelectric轻松解决此问题并在IDE中进行测试.

正如dtmilano所说,你无法在你的笔记本电脑上运行Android代码,但Roboelectric基本上替代了Android.jar中存根的实际方法实现.

如果您使用此解决方案,需要注意两件事:

  • 如果使用IntelliJ,请确保您的JAR导入位于依赖项列表中的Android JAR之上

  • 它假定您实际上并不想在某处更改服务器的状态,它默认阻止HTTP请求.但是,你可以很容易地禁用它:Roboelectric.getFakeHttpLayer().interceptHttpRequests(false);


Kon*_*uda 5

如前所述,jar除了编译之外,Android 并不适合做任何事情.即使是大多数无辜的东西也完全被剔除了.但是你仍然可以在具有良好模拟框架的主机VM单元测试中使用它们.我的选择是jmockit:

不知道它是否适用于Fitnesse