Loopj (метод получения AsyncHttpClient) не возвращает ответ в Android Unit Test

Я пытаюсь создать Unit test в Android-проекте, который работает с запросами URL. Я использую библиотеку loopj, но что-то не работает. Интернет включен в моем манифесте:

<uses-permission android:name="android.permission.INTERNET" /> 

Java-код в методе тестирования:

  AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.yahoo.com", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { System.out.println(response); // <------ I never get here!?!?! } }); 

Процедура заполнения (без loopj) работает в одном модульном методе тестирования:

  URL yahoo; yahoo = new URL("http://www.yahoo.com/"); BufferedReader in; in = new BufferedReader(new InputStreamReader(yahoo.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); } in.close(); 

Похоже, что запросы loopj не работают в модульном тестовом классе, но он работает нормально в базовом классе Activity. Любое предложение?

Проблема в том, что loopj использует android.os.AsyncTask, который не работает в единичной тестовой среде.

Ключом к успеху является метод «runTestOnUiThread».

 public void testAsyncHttpClient() throws Throwable { final CountDownLatch signal = new CountDownLatch(1); final AsyncHttpClient httpClient = new AsyncHttpClient(); final StringBuilder strBuilder = new StringBuilder(); runTestOnUiThread(new Runnable() { // THIS IS THE KEY TO SUCCESS @Override public void run() { httpClient .get( "https://api.twitter.com/1/users/show.json?screen_name=TwitterAPI&include_entities=true", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { // Do not do assertions here or it will stop the whole testing upon failure strBuilder.append(response); } public void onFinish() { signal.countDown(); } }); } }); try { signal.await(30, TimeUnit.SECONDS); // wait for callback } catch (InterruptedException e) { e.printStackTrace(); } JSONObject jsonRes = new JSONObject(strBuilder.toString()); try { // Test your jsonResult here assertEquals(6253282, jsonRes.getInt("id")); } catch (Exception e) { } assertEquals(0, signal.getCount()); } 

Ful thread: https://github.com/loopj/android-async-http/issues/173

Осторожно, что вы не забыли объявить доступ к сети в манифесте, т.е.

 <manifest ....> ... <uses-permission android:name="android.permission.INTERNET" /> ... </manifest> 

Асинхронный клиент Http-клиент для Android, построенный поверх библиотек HttpClient от Apache. Все запросы выполняются вне основного потока пользовательского интерфейса вашего приложения, но любая логика обратного вызова будет выполнена в том же потоке, что и обратный вызов, с помощью передачи сообщения обработчика Android.

Проверьте http://loopj.com/android-async-http/, это может вам помочь!