AndroidHttpClient не найден (при запуске Robolectric)

Я создал очень простой проект для тестирования интеграции Robolectric + Data Binding + Retrolambda. Когда я запускаю тестовый костюм, я получаю следующее сообщение:

Error:(30, 30) Gradle: error: cannot access AndroidHttpClient
class file for android.net.http.AndroidHttpClient not found

Это довольно странно, так как я нигде не использую AndroidHttpClient.


Ошибка возникает здесь, в строке "активность":

@Before
public void setup() {
    activity = Robolectric.setupActivity(MainActivity.class); // Error on this line
    textView = (TextView) shadowOf(activity).findViewById(R.id.textView);
    button = (Button) activity.findViewById(R.id.button);
    editText = (EditText) activity.findViewById(R.id.editText);
}

Программа никогда не использует AndroidHttpClient. На самом деле это вся программа:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

    binding.setUser(new User());
    binding.button.setOnClickListener((v) -> {
        binding.textView.setText(String.format("Hello, %s!", binding.editText.getText()));
        binding.editText.setText("");
    });
}

Идеи относительно того, что не так?

5 ответов

Решение

AndroidHttpClient был удален из SDK в v23 из инструментов сборки.

Поскольку Robolectric работает с более ранними версиями, он ожидает его появления, поэтому вы видите эту ошибку.

Сейчас вы можете добавить его обратно в:

android {
    useLibrary 'org.apache.http.legacy'
}

Как подробно здесь.

Robolectric открыт билет на GitHub, чтобы это исправить. Вы можете следить за темой / билетом здесь.

Обновить:

Как правильно отметили некоторые люди, лучший способ сделать это - создать класс android.net.http.AndroidHttpClient в ваших тестовых ресурсах. Это был бы предпочтительный метод, потому что вы изменяете только источники тестов, а не рабочий код, чтобы приспособить тесты.

Я только что добавил поддельный класс android.net.http.AndroidHttpClient в моих тестовых источниках. И это решило проблему на данный момент. Ожидание обновления Robolectric

Видимая проблема и решение:

AndroidHttpClient был удален из SDK в API Level 23, в то время как Robolectric был настроен для запуска тестов с SDK 21:

AndroidHttpClient was removed from the SDK in API Level 23

Если целевой SDK равен 28, то в соответствии с этим мы должны поместить следующую строку в AndroidManifest.xml

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

Я смог решить эту проблему, создав новый класс под названием AndroidHttpClient в новой упаковке android.net.http, После этого я должен был аннотировать свой класс модульного теста @Config(constants = BuildConfig.class, sdks = 21) который будет запускать тесты с эмулированной версией API 21, которая на данный момент является последней версией Android Robolectric.

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

Другие вопросы по тегам