2015-09-24 20 views
27

Tôi đã thiết lập một dự án rất đơn giản để kiểm tra sự tích hợp của Robolectric + Data Binding + Retrolambda. Khi tôi chạy thử nghiệm, tôi nhận được thông báo sau:Không tìm thấy AndroidHttpClient (khi chạy Robolectric)

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

Điều này khá lạ vì tôi không sử dụng AndroidHttpClient ở bất kỳ đâu.


Lỗi này xảy ra ở đây, trên các "hoạt động" dòng: Chương trình

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

Các không bao giờ sử dụng AndroidHttpClient. Trong thực tế, đây là toàn bộ chương trình:

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

Ý tưởng như những gì vậy?

+3

'AndroidHttpClient' đã bị xóa khỏi SDK ở cấp API 23, vì vậy nếu' compileSdkVersion' của bạn là 23 hoặc cao hơn, điều đó sẽ giải thích lý do lớp không được tìm thấy. Về lý do tại sao Robolectric đang cố gắng truy cập vào lớp đó, mà tôi không thể nói. – CommonsWare

+0

Điều đó đã sửa nó! Tôi đã chạy thử nghiệm với: "@Config (hằng số = BuildConfig.class, sdk = 21)". Cảm ơn! – Technocrat

+0

Viết câu trả lời để mọi người sẽ hưởng lợi –

Trả lời

43

AndroidHttpClient đã bị xóa khỏi SDK trong v23 của các công cụ xây dựng.

Vì Robolectric đang chạy với các phiên bản cũ hơn, nó hy vọng nó sẽ ở đó, đó là lý do tại sao bạn thấy lỗi này.

Còn bây giờ, bạn có thể thêm nó trở lại:

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

Như chi tiết here.

Có vé GitHub mở cho Robolectric để sửa lỗi này. Bạn có thể thực hiện theo chủ đề/vé here.

+6

Xin đừng làm vậy. Bằng cách thêm thư viện lỗi thời, bạn đang làm đầy ứng dụng của mình bằng mã chỉ được sử dụng để thử nghiệm. –

+0

Lỗi: Thực hiện không thành công cho tác vụ ': app: transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: mục trùng lặp: org/apache/http/ConnectionClosedException.class –

5

biểu kiến ​​vấn đề và giải pháp:

AndroidHttpClient đã bị xóa khỏi SDK trong API Level 23, trong khi Robolectric được thiết lập để chạy thử nghiệm với SDK 21:

AndroidHttpClient was removed from the SDK in API Level 23 
+0

Tôi đang gặp vấn đề tương tự, giải pháp thực tế là gì? Đối với tôi biên dịch với API cấp 22 có lẽ không phải là một câu trả lời. –

+0

Khi tôi nhớ lại, vấn đề AndroidHttpClient đã được gây ra bởi một sự khác biệt giữa phiên bản sdk đặt cho robolectric (21) và compileSdkVersion (23).Tuy nhiên, tôi đã viết dự án để đánh giá thư viện ràng buộc dữ liệu và kết thúc việc kết luận vẫn còn quá nhiều vấn đề. – Technocrat

16

Tôi vừa thêm lớp giả android.net.http.AndroidHttpClient vào nguồn thử nghiệm của mình. Và nó đã giải quyết vấn đề cho bây giờ. Đang chờ Robolectric được cập nhật

+1

Điều này giải quyết nó cho tôi với mức độ tác động tối thiểu. Việc sử dụng các kết quả 'useLibrary' trong các mục bổ sung được gộp vào ứng dụng chính của bạn trong khi thêm lớp này dưới' src/test/java' không ảnh hưởng đến ứng dụng chính. –

5

Tôi đã có thể giải quyết vấn đề này bằng cách tạo một lớp mới gọi là AndroidHttpClient trong gói mới android.net.http. Sau đó tôi phải chú thích lớp Unit Test của mình với @Config(constants = BuildConfig.class, sdks = 21) sẽ chạy các thử nghiệm dựa trên phiên bản mô phỏng API 21, phiên bản cuối cùng của hỗ trợ Android Robolectric hiện tại.

Hiện tại, đã xảy ra sự cố khi mở here, vì vậy sau khi phát hành phiên bản 3.1 mọi thứ sẽ ổn và bạn sẽ không phải sử dụng giải pháp này.

Các vấn đề liên quan