Android http-тестирование с помощью Robolectric

У меня есть приложение для Android, где основной частью приложения является класс APIcalls.java, где я делаю http-запросы для получения данных с сервера, отображая данные в приложении.

Я хотел создать unit test для этого класса Java, так как это большая часть приложения. Вот способ получения данных с сервера:

StringBuilder sb = new StringBuilder();

try {

  httpclient = new DefaultHttpClient(); 
  Httpget httpget = new HttpGet(url);

  HttpEntity entity = null;
  try {
    HttpResponse response = httpclient.execute(httpget);
    entity = response.getEntity();
  } catch (Exception e) {
    Log.d("Exception", e);
  }


  if (entity != null) {
    InputStream is = null;
    is = entity.getContent();

    try {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is));

      while ((line = reader.readLine()) != null) {
       sb.append(line + "\n");
     }
      reader.close();
    } catch (IOException e) {

           throw e;

       } catch (RuntimeException e) {

           httpget.abort();
           throw e;

       } finally {

         is.close();

       }
       httpclient.getConnectionManager().shutdown();
  }
} catch (Exception e) {
  Log.d("Exception", e);
}

String result = sb.toString().trim();

return result;

Я подумал, что могу сделать простые вызовы API из тестов следующим образом:

api.get("www.example.com")

Но каждый раз, когда я делаю некоторые HTTP-вызовы из тестов, я получаю сообщение об ошибке:

Unexpected HTTP call GET

Я знаю, что я делаю что-то не так, но может ли кто-нибудь сказать мне, как я могу правильно проверить этот класс на Android?

Ответ 1

Robolectric предоставляет некоторые вспомогательные методы для подделки ответа HTTP для DefaultHttpClient. Если вы используете DefaultHttpClient без использования этих методов, вы получите предупреждающее сообщение.

Вот пример того, как издеваться над ответом на http:

@RunWith(RobolectricTestRunner.class)
public class ApiTest {

    @Test
    public void test() {
        Api api = new Api();
        Robolectric.addPendingHttpResponse(200, "dummy");
        String responseBody = api.get("www.example.com");
        assertThat(responseBody, is("dummy"));
    }
}

Вы можете найти больше примеров, просмотрев Robolectric test codes.

Ответ 2

Спасибо за все ваши ответы, но я нашел то, что искал. Я хотел протестировать реальные HTTP-вызовы.

Добавив Robolectric.getFakeHttpLayer().interceptHttpRequests(false); вы скажете Robolectric не перехватывать эти запросы, и это позволяет вам совершать настоящие HTTP-вызовы

Ответ 3

Я ответил на другую версию этого же вопроса, но...

То, что у вас здесь, не использует ничего от Android, поэтому Robolectric в основном не имеет значения. Это стандартная Java и HTTP-библиотека Apache. Вам просто нужна насмешливая фреймворк и зависимость, чтобы имитировать HttpClient (см. Мой другой ответ для ссылок). Он не имеет доступа к сети во время модульного тестирования, и поэтому он терпит неудачу.

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