Apache DefaultHttpClient invocation results in “java.lang.RuntimeException: Stub!”

后端 未结 5 467
终归单人心
终归单人心 2020-12-18 08:31

I\'m dipping my toes into Android development. I have a project that will interface with a RESTful resource and I\'m trying to figure out how to do a basic GET with params o

相关标签:
5条回答
  • 2020-12-18 09:06

    After API 28, legacy libraries such as HttpClient have been deprecated, throws a Stub! error and you must now include this in your Manifest file:

      <uses-library
       android:name="org.apache.http.legacy"
       android:required="false" />
    

    https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library

    0 讨论(0)
  • 2020-12-18 09:07

    This happens when using Proguard and the com.apache.http.legacy library in Android SDK 23.

    It worked after I added this to my Proguard config:

    -keep class org.apache.http.** { *; }
    -keep class org.apache.commons.codec.** { *; }
    -keep class org.apache.commons.logging.** { *; }
    -keep class android.net.compatibility.** { *; }
    -keep class android.net.http.** { *; }
    -keep class com.android.internal.http.multipart.** { *; }
    -dontwarn org.apache.http.**
    -dontwarn android.webkit.**
    

    Which allows the system Apache implementation to properly override the stubs compiled into the app.

    0 讨论(0)
  • 2020-12-18 09:08

    I think this is Android's way of telling you that you cannot run that unit test on that platform. Unit tests that involve interacting with the Android platform (e.g. the network in this case) need to be run on an actual Android device or a functioning Android emulator.

    (They cannot be run in the context of regular Eclipse. In the early days, you needed Android plugins for Eclipse. These days (since 2013) you should be using Android Studio which build on Intellij.)

    Apparently, what you were actually doing was running the unit tests against the stub classes provided by the Android SDK. This cannot ever work.

    0 讨论(0)
  • 2020-12-18 09:10

    This thread kind of old, but to whoever doesn't know, Robolectric solves this problem for testing.

    0 讨论(0)
  • 2020-12-18 09:15

    For anyone who may be interested, I bumped into a similar problem - though instead of HttpClient I was getting stub errors for DateUtils.

    Stephen appears to be absolutely correct - classes that are part of the Android platform need the emulator up and running: http://simpleprogrammer.com/2010/07/27/the-best-way-to-unit-test-in-android/

    Really quick summary of the above link:

    As a matter of fact, all the methods are stubbed out to throw an exception with the message “Stub!” when you call them. How cute.

    The real android.jar implementations live on the emulator, or your real Android device.

    Therefore, you can unit test...

    • on the emulator - get the full Android platform, "real" android environment etc (but without the power of common Java unit test tools - eg JMock)

    OR

    • with the JVM - faster, can use unit test helpers like JMock etc , however you can't test anything that relies on the Android platform.
    0 讨论(0)
提交回复
热议问题