ไม่พบ 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("");
    });
}

ความคิดเกี่ยวกับสิ่งที่ผิดปกติ?


person Technocrat    schedule 24.09.2015    source แหล่งที่มา
comment
AndroidHttpClient ถูกลบออกจาก SDK ใน API ระดับ 23 ดังนั้นหาก compileSdkVersion ของคุณคือ 23 หรือสูงกว่า นั่นจะอธิบายได้ว่าเหตุใดจึงไม่พบคลาส เหตุใด Robolectric จึงพยายามเข้าถึงคลาสนั้นซึ่งฉันไม่สามารถพูดได้   -  person CommonsWare    schedule 24.09.2015
comment
นั่นแก้ไขมัน! ฉันกำลังรันการทดสอบด้วย: @Config(constants = BuildConfig.class, sdk = 21) ขอบคุณ!   -  person Technocrat    schedule 24.09.2015
comment
เขียนคำตอบเพื่อให้ทุกคนได้รับประโยชน์   -  person Eugen Martynov    schedule 24.09.2015


คำตอบ (5)


AndroidHttpClient ถูกลบออกจาก SDK ใน v23 ของเครื่องมือบิลด์

เนื่องจาก Robolectric ทำงานกับเวอร์ชันก่อนหน้า จึงคาดว่าจะมีเวอร์ชันดังกล่าว ซึ่งเป็นสาเหตุว่าทำไมคุณจึงเห็นข้อผิดพลาดนี้

ในตอนนี้ คุณสามารถเพิ่มกลับเข้าไปใน:

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

ตามรายละเอียดที่นี่.

มีตั๋ว GitHub เปิดให้ Robolectric แก้ไขปัญหานี้ ติดตาม thread/ticket ได้ที่นี่

อัปเดต:

ตามที่บางคนชี้ให้เห็นอย่างถูกต้อง วิธีที่ดีกว่าในการทำเช่นนี้คือการสร้างคลาส android.net.http.AndroidHttpClient ในแหล่งข้อมูลทดสอบของคุณ วิธีนี้จะเป็นวิธีที่แนะนำเนื่องจากคุณแก้ไขแหล่งที่มาของการทดสอบเท่านั้น ไม่ใช่รหัสที่ใช้งานจริง เพื่อรองรับการทดสอบ

person Ben Pearson    schedule 01.10.2015
comment
กรุณาอย่าทำอย่างนั้น. การเพิ่มไลบรารี่ที่ล้าสมัยจะทำให้แอปของคุณบวมด้วยโค้ดที่ใช้สำหรับการทดสอบเท่านั้น - person Dmitry Zaytsev; 06.10.2015
comment
ข้อผิดพลาด: การดำเนินการล้มเหลวสำหรับงาน ': แอป: TransformerClassesWithJarMergingForDebug' › com.android.build.api.transform.TransformException: java.util.zip.ZipException: รายการที่ซ้ำกัน: org/apache/http/ConnectionClosedException.class - person Iman Marashi; 25.11.2016
comment
@DmitryZaytsev จุดดี เนื่องจากคำตอบนี้ได้รับความสนใจค่อนข้างมาก ฉันจึงอัปเดตคำตอบดังกล่าว - person Ben Pearson; 28.05.2018

ฉันเพิ่งเพิ่มคลาสปลอม android.net.http.AndroidHttpClient ในแหล่งทดสอบของฉัน และมันก็แก้ไขปัญหาได้ในตอนนี้ กำลังรอการอัปเดต Robolectric

person Eugen Martynov    schedule 02.10.2015
comment
วิธีนี้แก้ไขได้สำหรับฉันโดยมีผลกระทบน้อยที่สุด การใช้ useLibrary ส่งผลให้มีรายการพิเศษรวมอยู่ในแอปหลักของคุณ ในขณะที่การเพิ่มคลาสนี้ภายใต้ src/test/java จะไม่ส่งผลกระทบต่อแอปหลัก - person Craig Russell; 30.10.2015

ปัญหาและแนวทางแก้ไขที่ปรากฏ:

AndroidHttpClient ถูกลบออกจาก SDK ใน API ระดับ 23 ในขณะที่ Robolectric ถูกตั้งค่าให้รันการทดสอบด้วย SDK 21:

AndroidHttpClient was removed from the SDK in API Level 23
person Technocrat    schedule 25.09.2015
comment
ฉันประสบปัญหาเดียวกัน วิธีแก้ปัญหาที่แท้จริงคืออะไร สำหรับฉันการรวบรวมด้วย API ระดับ 22 อาจไม่ใช่คำตอบ - person David Berry; 29.09.2015
comment
ตามที่ฉันจำได้ ปัญหา AndroidHttpClient มีสาเหตุมาจากความแตกต่างระหว่างเวอร์ชัน sdk ที่ตั้งค่าสำหรับ robolectric (21) และ CompilSdkVersion (23) อย่างไรก็ตาม ฉันเขียนโปรเจ็กต์เพื่อประเมินไลบรารีการเชื่อมโยงข้อมูล และลงเอยด้วยการสรุปว่ายังมีปัญหามากเกินไป - person Technocrat; 29.09.2015

ฉันสามารถแก้ไขปัญหานี้ได้ด้วยการสร้างคลาสใหม่ชื่อ AndroidHttpClient ภายในแพ็คเกจใหม่ android.net.http หลังจากนั้นฉันต้องใส่คำอธิบายประกอบคลาสการทดสอบหน่วยด้วย @Config(constants = BuildConfig.class, sdks = 21) ซึ่งจะทำการทดสอบกับ API 21 เวอร์ชันจำลองซึ่งเป็นเวอร์ชันล่าสุดของ Android Robolectric รองรับในปัจจุบัน

ขณะนี้มีปัญหาเปิดอยู่ที่นี่ ดังนั้นเมื่อเปิดตัวเวอร์ชัน 3.1 ทุกอย่างควรจะเรียบร้อยดีและ คุณจะไม่ต้องใช้วิธีแก้ปัญหานี้

person CodyEngel    schedule 18.11.2015

หาก SDK เป้าหมายคือ 28 ขึ้นไป ให้เป็นไปตาม นี่ เราต้องใส่บรรทัดต่อไปนี้ใน AndroidManifest.xml

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