Тайм-аут подключения Android в модульном тестировании (robolectric)

У меня есть некоторые проблемы с моей резьбой. В режиме отладки и во время модульных тестов AsyncTask не выполняется как один поток.

Кроме того, я получаю тайм-аут, когда пытаюсь проверить свой HTTP-сообщение на реальном сервере. Я получил это раньше в эмуляторе, и это было решено

StrictMode.setThreadPolicy(policy);

К сожалению, это не работает на Robolectric, потому что я получаю сообщение об ошибке

java.lang.NoClassDefFoundError: dalvik/system/CloseGuard$Reporter

как я могу решить эту проблему и продолжить создание своих модульных тестов с помощью robolectric? Возможно ли, что я обработал что-то неправильно во время потоков? Асинхронная задача:

public class HttpPostTask extends
    AsyncTask<MyContainer, Integer, MyResult> {
    @Override
    protected MyResult doInBackground(MyContainer... params) {
           /* some code here */
           resp = client.execute(container.post);
    }
}

выполнение асинхронной задачи:

new HttpPostTask().execute(container);

Спасибо

=============== ОБНОВЛЕНИЕ ==================== Я вставил несколько отпечатков, чтобы выяснить, в какой теме работает сообщение. Вот результаты:

в эмуляторе:

09-27 09:19:12.909: I/System.out(1813): Running REST Client on thread 'Thread-83' 
 09-27 09:19:12.909: I/System.out(1813): Running HTTP Post on thread 'AsyncTask #2'

в Робоэлектрике:

Running REST Client on thread 'main' 
  Running HTTP Post on thread 'main' 

через некоторое время я получаю отказ + исключение тайм-аута:

org.apache.http.conn.HttpHostConnectException: Connection to http://10.0.2.2:8080 refused

Чтобы обойти HTTP-сообщение Robolectric, я использовал это: 'Robolectric.getFakeHttpLayer().interceptHttpRequests(false);'


person elCapitano    schedule 24.09.2013    source источник
comment
Конечно же, сервер запущен.   -  person elCapitano    schedule 24.09.2013


Ответы (1)


Обновление. Я работаю над обновлением для Robolectric, которое превратит некоторые базовые StrictMode методы в неоперативные, чтобы не взорвать набор тестов. Тем не менее, я все еще думаю, что что-то не так, если ваше приложение не работает без него.


Несколько вещей здесь:

Планирование задач

Robolectric работает с одним потоком. Он имитирует луперы пользовательского интерфейса и фона и позволяет вам взаимодействовать с ними в тестах, используя Robolectric.getUiThreadScheduler() и Robolectric.getBackgroundScheduler(). С Scheduler вы можете pause(), unPause(), runOneTask() и многое другое. По умолчанию все AsyncTask запускаются сразу после execute().

Тестирование HTTP-запросов

Хотя полный интеграционный тест, объединяющий Android и базовый веб-сервер, является хорошей идеей, большинство тестов Robolectric носят скорее модульный характер. Я бы рекомендовал использовать Robolectric.addPendingHttpRequest() для предоставления поддельных ответов для большинства тестов.

Строгий режим

Я не думаю, что это поддерживается Robolectric, но я не исследовал. Не имеет смысла использовать на основе документации Android, учитывая, что Robolectric является однопоточным.

person Corey D    schedule 24.09.2013
comment
Спасибо за вашу помощь. Мне нужно выполнить настоящие пост-тесты HTTP, но я получаю тайм-аут без использования строгого режима. Есть ли другой способ делать настоящие HTTP-сообщения с помощью robolectric? - person elCapitano; 26.09.2013
comment
Android не позволяет запускать сетевые запросы в потоке пользовательского интерфейса. Это делается для того, чтобы запросы не забивали интерфейс во время их выполнения. Вам нужно выполнить запрос в отдельном потоке. Думаю проблема в этом потому что в эмуляторе все работает нормально. - person elCapitano; 26.09.2013
comment
источник для цитаты: stackoverflow. ком/вопросы/10734717/ - person elCapitano; 26.09.2013
comment
Вы должны иметь возможность использовать настоящий HTTP, следуя этому: stackoverflow.com/questions/9475998/ - person Corey D; 26.09.2013
comment
Я не уверен, почему вы всегда получаете тайм-аут без StrictMode, но похоже на запах, что в потоке пользовательского интерфейса выполняется что-то, чего не должно быть. Есть ли еще код, который вы можете предоставить? - person Corey D; 26.09.2013
comment
Мое приложение работает без StrictMode, но не в однопоточном режиме. Возможно, мне следует взглянуть на мой JSON-пост. Когда будет доступно обновление? Как Robolectric обрабатывает потоки в android.jar? - person elCapitano; 27.09.2013
comment
Это похожая проблема?: groups.google.com/forum/# !msg/robolectric/Z3Yg04gL4hg/ - person elCapitano; 27.09.2013
comment
@CoreyD По умолчанию все AsyncTasks запускаются сразу после выполнения(), это из документации? Не могли бы вы дать ссылку? - person dephinera; 30.05.2018