Intereting Posts
Как выбрать несколько флажков в подменю на Android? Android 5.0 (API 21) не позволяет создавать собственные шрифты / шрифты Чтение температуры через DHT11 с помощью Android Things Как пользовательское приложение whatsapp обнаруживает изменение в изображении профиля своего контакта? Сервер ADB не подтвердил Перехват исходящих SMS-сообщений Android – ограничение перетаскивания в ограничительную рамку MotionEvent.ACTION_POINTER_DOWN был обнаружен в методе OnInterceptTouchEvent ViewGroup в Android? Неопределенный прогрессBar не отображается во время операции AsyncTask Исходный код Android не работает, считывая буфер кадра через glReadPixels Edittext – как скрыть подстрочный Сделать Bluetooth на Android 2.1 доступным на неопределенный срок Как показать выбор LST-элемента в режиме ресайклера в android? У эмулятора AVD нет возможности синхронизации с Google Calendar Как получить высоту элемента recyclerview в "onBindViewHolder"

Вызов Apache DefaultHttpClient приводит к «java.lang.RuntimeException: Stub!»

Я погружаюсь в разработку Android. У меня есть проект, который будет взаимодействовать с ресурсом RESTful, и я пытаюсь выяснить, как выполнить базовое GET с параметрами по HTTP. Из всего, что я прочитал, консенсус, похоже, благоприятствует HTTPClient через HttpURLConnection.

Я написал класс-оболочку с помощью метода, который занимается созданием экземпляра ключевого объекта для запроса с использованием 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. Является ли библиотека Apache Commons в комплекте с Android SDK значительно отличающейся от стандартной библиотеки?

Я думаю, что это способ Android сказать вам, что вы не можете запустить этот модульный тест на этой платформе. Единичные тесты, которые включают взаимодействие с платформой Android (например, сеть в этом случае), должны запускаться на реальном устройстве Android или функционирующем эмуляторе Android.

По-видимому, вы запускаете модульные тесты против классов-заглушек в Android SDK.

Для всех, кто может быть заинтересован, я столкнулся с подобной проблемой – хотя вместо HttpClient я получал ошибки заглушки для DateUtils .

Стивен, кажется, абсолютно прав – классы, входящие в платформу Android, нуждаются в эмуляторе: http://simpleprogrammer.com/2010/07/27/the-best-way-to-unit-test-in- андроид /

Действительно краткое изложение приведенной выше ссылки:

На самом деле все методы зачеркнуты, чтобы вызвать исключение с сообщением «Stub!», Когда вы их вызываете. Какой милый.

Реальные версии android.jar живут на эмуляторе или на вашем реальном устройстве Android.

Поэтому вы можете выполнить единичный тест …

  • На эмуляторе – получить полную платформу Android, «настоящую» среду Android и т. Д. (Но без возможности использования стандартных инструментов тестирования Java-модулей – например, JMock)

ИЛИ

  • С JVM – быстрее, можете использовать вспомогательные тестовые утилиты, такие как JMock и т. Д., Однако вы не можете тестировать все, что зависит от платформы Android.

Это происходит при использовании Proguard и библиотеки com.apache.http.legacy в Android SDK 23.

Он работал после того, как я добавил это в мою конфигурацию Proguard:

 -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.** 

Это позволяет системной реализации Apache правильно переопределять заглушки, скомпилированные в приложение.

Этот поток старый, но для тех, кто этого не знает, Robolectric решает эту проблему для тестирования.