AndroidHttpClient tidak ditemukan (saat menjalankan Robolectric)

Saya telah menyiapkan proyek yang sangat sederhana untuk menguji integrasi Robolectric + Data Binding + Retrolambda. Ketika saya menjalankan test suit, saya mendapatkan pesan berikut:

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

Ini cukup aneh karena saya tidak menggunakan AndroidHttpClient di mana pun.


Kesalahan terjadi di sini, pada baris "aktivitas":

@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);
}

Program ini tidak pernah menggunakan AndroidHttpClient. Sebenarnya, ini keseluruhan programnya:

@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("");
    });
}

Gagasan tentang apa yang salah?


person Technocrat    schedule 24.09.2015    source sumber
comment
AndroidHttpClient telah dihapus dari SDK di API Level 23, jadi jika compileSdkVersion Anda 23 atau lebih tinggi, itu akan menjelaskan mengapa kelas tersebut tidak ditemukan. Mengapa Robolectric mencoba mengakses kelas itu, saya tidak bisa mengatakannya.   -  person CommonsWare    schedule 24.09.2015
comment
Itu memperbaikinya! Saya menjalankan tes dengan: @Config(constants = BuildConfig.class, sdk = 21). Terima kasih!   -  person Technocrat    schedule 24.09.2015
comment
Tulis jawabannya sehingga semua orang mendapat manfaat   -  person Eugen Martynov    schedule 24.09.2015


Jawaban (5)


AndroidHttpClient telah dihapus dari SDK di v23 alat build.

Karena Robolectric berjalan melawan versi sebelumnya, Robolectric mengharapkannya ada di sana, itulah sebabnya Anda melihat kesalahan ini.

Untuk saat ini, Anda dapat menambahkannya kembali:

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

Sebagaimana dirinci di sini.

Ada tiket GitHub yang terbuka bagi Robolectric untuk memperbaikinya. Anda dapat mengikuti thread/tiket di sini.

Memperbarui:

Seperti yang telah ditunjukkan dengan benar oleh beberapa orang, cara yang lebih baik untuk melakukan ini adalah dengan membuat kelas android.net.http.AndroidHttpClient di sumber daya pengujian Anda. Ini akan menjadi metode yang disukai karena Anda hanya memodifikasi sumber pengujian, bukan kode produksi, untuk mengakomodasi pengujian.

person Ben Pearson    schedule 01.10.2015
comment
Tolong jangan lakukan itu. Dengan menambahkan perpustakaan yang sudah usang, Anda membebani aplikasi Anda dengan kode yang hanya digunakan untuk pengujian. - person Dmitry Zaytsev; 06.10.2015
comment
Kesalahan:Eksekusi gagal untuk tugas ':app:transformClassesWithJarMergingForDebug'. › com.android.build.api.transform.TransformException: java.util.zip.ZipException: entri duplikat: org/Apache/http/ConnectionClosedException.class - person Iman Marashi; 25.11.2016
comment
@DmitryZaytsev poin bagus. Karena jawabannya mendapat cukup banyak perhatian, saya telah memperbaruinya. - person Ben Pearson; 28.05.2018

Saya baru saja menambahkan kelas palsu android.net.http.AndroidHttpClient di sumber pengujian saya. Dan itu menyelesaikan masalah untuk saat ini. Menunggu Robolectric diperbarui

person Eugen Martynov    schedule 02.10.2015
comment
Ini menyelesaikannya untuk saya dengan tingkat dampak minimal. Penggunaan useLibrary mengakibatkan item tambahan digabungkan ke dalam aplikasi utama Anda, sedangkan menambahkan kelas ini di bawah src/test/java tidak berdampak pada aplikasi utama. - person Craig Russell; 30.10.2015

Masalah dan solusi yang terlihat:

AndroidHttpClient telah dihapus dari SDK di API Level 23, sementara Robolectric disetel untuk menjalankan pengujian dengan SDK 21:

AndroidHttpClient was removed from the SDK in API Level 23
person Technocrat    schedule 25.09.2015
comment
Saya mengalami masalah yang sama, apa solusi sebenarnya? Bagi saya kompilasi dengan API Level 22 mungkin bukanlah sebuah jawaban. - person David Berry; 29.09.2015
comment
Seingat saya, masalah AndroidHttpClient disebabkan oleh perbedaan antara versi SDK yang disetel untuk robolectric (21) dan kompilasiSdkVersion (23). Namun, saya menulis proyek untuk mengevaluasi perpustakaan pengikatan data dan akhirnya menyimpulkan masih terlalu banyak masalah. - person Technocrat; 29.09.2015

Saya dapat mengatasi masalah ini dengan membuat kelas baru bernama AndroidHttpClient dalam paket baru android.net.http. Setelah itu saya harus memberi anotasi pada kelas Unit Test saya dengan @Config(constants = BuildConfig.class, sdks = 21) yang akan menjalankan pengujian terhadap versi emulasi API 21 yang merupakan versi terakhir yang didukung Android Robolectric saat ini.

Saat ini ada masalah yang dibuka di sini, jadi setelah mereka merilis versi 3.1 semuanya akan baik-baik saja dan Anda tidak perlu menggunakan solusi ini.

person CodyEngel    schedule 18.11.2015

Jika SDK target adalah 28 atau lebih tinggi maka menurut ini, kita harus meletakkan baris berikut di AndroidManifest.xml

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
person Naveed Ali    schedule 19.10.2018