当前位置: 首页 > 面试题库 >

Apache DefaultHttpClient调用的结果为“ j​​ava.lang.RuntimeException:Stub!”

夹谷浩博
2023-03-14
问题内容

我正在全力投入Android开发。我有一个将与RESTful资源交互的项目,并且我试图弄清楚如何通过HTTP使用参数进行基本的GET。从我阅读的所有内容来看,共识似乎比HTTPURLConnection更偏爱HTTPClient。

我编写了一个包装器类,该包装器的方法负责实例化关键对象以使用HTTPClient发出请求:

public String get() {  
    String responseString = null;

    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet();
    try {
        get.setURI(new URI(this.baseURL()));
    } catch (URISyntaxException e1) {
        e1.printStackTrace();
    }

    HttpResponse response;

    try {
        response = client.execute(get);
        responseString = readResponse(response.getEntity());

        if(response != null) {
            System.out.println(responseString);
        }
    } catch(ClientProtocolException e) {
        e.printStackTrace();
    } catch(IOException e) {
        e.printStackTrace();
    }

    return responseString;

}

该行HttpClient client = new DefaultHttpClient();引发以下异常:

java.lang.RuntimeException: Stub!
at org.apache.http.impl.client.AbstractHttpClient.<init>(AbstractHttpClient.java:5)
at org.apache.http.impl.client.DefaultHttpClient.<init>(DefaultHttpClient.java:7)
at org.rcindustries.appmap.RestClient.get(RestClient.java:54)
at org.rcindustries.appmap.test.functional.RestClientTest.shouldReturnSomeJSon(RestClientTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

我为HttpClient看到的每个示例都使用类似的结构来执行GET和POST。与Android SDK捆绑在一起的Apache
Commons库是否与标准库明显不同?


问题答案:

我认为这是Android告诉您无法在该平台上运行该单元测试的方法。涉及与Android平台(例如网络)交互的单元测试需要在实际的Android设备或运行正常的Android仿真器上运行。

(它们不能在常规Eclipse的上下文中运行。在早期,您需要用于Eclipse的Android插件。现在(自2013年起),您应该使用基于Intellij构建的Android
Studio。)

显然,您实际上是在针对Android SDK提供的存根类运行单元测试。这永远行不通。



 类似资料:
  • 问题内容: 在Obj-C中,常见的做法是使用便利功能执行常见的操作,例如为视图配置自动布局: 如果您只需要设置约束而忘了它,则可以调用: 如果要稍后存储约束以便可以删除/修改约束,则可以执行以下操作: 我想快速执行此操作,但是如果我调用上述函数并且不捕获返回的约束,则会收到警告: 很烦人。有什么方法可以让Swift知道我并不总是想获取返回值吗? 注意:我知道这一点。这很丑陋,而不是我要的东西: 问

  • 问题内容: 我正在为Google Chrome创建(学习)扩展程序。 为了调试一些代码,我插入,如下所示: 这是非常简单的代码:将所有选项卡信息放入我自己的数组中,并打印一些内容。 为了检查代码是否可以正常工作,我运行了代码。问题来了: 当我使用断点(通过开发人员工具)时,代码运行良好。 没有断点,什么都不会打印。 知道为什么吗? 问题答案: 您的问题可以简化为: 您希望在到达第5行时更新数组(由

  • 问题内容: 使用promise API,如何并行发送两个异步请求,以及如何将合并的结果解析为响应。 现在,当我像这样调用get()时 我需要获得指示的合并结果。如何使用Angular promise API做到这一点? 问题答案: 正如@Matt所说,您需要使用,但用法并不完全正确。AngularJS不支持,并且它们无论如何都不能那样工作,因为没有诸如对多个值的承诺之类的东西,相反,您仅对数组有一

  • 我创建了一个应用程序,其中一个地点列表保存在数据库中。我只根据Google留档保存了保存地点的地点ID。 然后我创建了一个界面,让用户输入他们的当前位置(mCurrentLocation)。 然后,我创建了一个异步任务,检查数据库中保存的每个地点ID,并检查哪些地点距离用户位置500米以内。这是在doInBackground中完成的。根据Google文档,我使用了getPlaceById和setR

  • 我将setResult(200)放在子活动的onCreate()中。 但是一旦我从父级调用finishActivity(),我就得到了结果代码0。 我不知道如何解释这种情况。 父级是: 孩子: 更新: 我明白将在子活动结束时被调用。 调用 不会获取子活动的 ActivityResult。 但是我想知道一旦子活动被父活动破坏,获取ActivityResult(结果代码和意图数据)的正确方法。 有什么

  • 问题内容: 我在一个开始从事的项目中遇到了这段代码。原始开发人员不再可用,我对此一无所知: 产生值为。这是如何运作的? 什么是运算符? 什么是运算符? 什么是运算符? 什么是运算符? 问题答案: 什么是运算符? 那是两个运算符,一个是赋值运算符,一个是一元加号,它什么都不做。 您是否输入错了并表示compund赋值运算符? 什么是运算符? 还有两个运算符,一个为后递增,一个为加法(根据最大划分规则