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

时间:2012-01-24 06:01:11

标签: android http testing rest 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(),一切正常。我想知道这个错误是否涉及在主线程上运行一个长任务?有什么想法吗?

4 个答案:

答案 0 :(得分:41)

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

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

答案 1 :(得分:9)

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

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

如果你选择这个解决方案,需要注意两件事:

  • 如果使用IntelliJ

  • ,请确保您的JAR导入位于依赖项列表中的Android JAR之上
  • 默认情况下,假设您实际上并不想在某处更改服务器的状态,则会阻止HTTP请求。但是,你可以很容易地禁用它:Roboelectric.getFakeHttpLayer()。interceptHttpRequests(false);

答案 2 :(得分:5)

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

不确定它是否适用于Fitnesse

答案 3 :(得分:0)

由于“静态”声明,我遇到了同样的问题。就我而言,.build()在静态变量中引起了问题。一种简单的解决方案是不将变量声明为静态。它可以是最终的。尝试从getJsonArrayFromUrl方法中删除“静态”,看看它是否有效。