Tôi đang cố gắng viết một bài kiểm tra đơn vị cho một đoạn mã với robolectric. Vấn đề là tôi cần phải giả cuộc gọi http nhưng dường như lớp giả của robolectric rằng nó chỉ làm việc với HttpClient của Apache như mỗi câu trả lời này:Robolectric + OkHttp + trang bị thêm + rxJava Kiểm tra Đơn vị
Trong Retrofit bạn không thể thay đổi URL nên MockWebServer dường không phải là một lựa chọn.
Có vẻ như mockito có thể bắt được các cuộc gọi lại trang bị thêm nhưng tôi đang sử dụng rxJava vì vậy tôi không thực sự biết nếu nó có thể giúp.
Có ai có bất kỳ đề xuất nào về thử nghiệm đơn vị với Robolectric + Retrofit + okHttp + rxJava không?
Đây là một đoạn mã nhỏ:
@Test
public void test1() throws IOException, InterruptedException {
FragmentA frag = (FragmentA) activity
.getFragmentManager().findFragmentById(
R.id.frag);
assertThat(frag).isNotNull();
assertThat(frag.isVisible()).isTrue();
EditText input1 = (EditText) frag.getView()
.findViewById(R.id.edit_text1);
EditText input2 = (EditText) frag.getView()
.findViewById(R.id.edit_text2);
Button button = (button) frag.getView()
.findViewById(R.id.button);
input1.setText("999");
input2.setText("999");
Robolectric.addPendingHttpResponse(200, "{\"isValid\": true}");
button.performClick();
assertThat(
ShadowAlertDialog.getLatestDialog() instanceof ProgressDialog)
.isTrue();
}
Robolectric.addPendingHttpResponse sẽ không hoạt động nào vì OkHttp. Cuộc gọi api được bắt đầu khi nút được nhấn để trong thời điểm đó, tôi cần giả mạo phản hồi!
Tôi không thể làm điều đó bởi vì RestAdapter là một phần của phần mở rộng của tôi về lớp ứng dụng. Vì vậy, trong phương pháp setUp tôi chỉ tạo ra các hoạt động mà cũng tạo ra các ứng dụng và lớp ứng dụng có chứa RestAdapter với url mặc định của dịch vụ api của tôi. Tôi có thể thêm một phương thức công khai vào lớp ứng dụng cho phép tôi thay đổi RestAdapter sau nhưng điều đó có nghĩa là chỉ thêm mã cho mục đích thử nghiệm và nó sai! – fedestylah
Vâng, nó là sai. Chúng tôi luôn có cùng một vấn đề khi tạo mocks. Sau khi đọc rất nhiều, một giải pháp để tạo ra mocks là tạo ra các nhà máy để tiêm phụ thuộc. Vì vậy, bạn sẽ thay đổi mã của bạn để tạo ra các nhà máy và không cho mục đích thử nghiệm (nếu bạn muốn xem nó theo cách đó: P) – mromer
nhưng dù sao bạn đang làm một số công việc mà bạn sẽ không làm !!:) I Nếu tôi không tìm thấy một cách tiếp cận tốt hơn, tôi sẽ cố gắng theo cách của bạn. Bạn có bất kỳ liên kết hoặc ví dụ, nơi là exaplained cách tiếp cận nhà máy? bởi vì tôi không phải là tâm sự với các nhà máy. cảm ơn! – fedestylah