2012-11-16 49 views
6

Kịch bản:Kiểm tra đơn vị Android với giải pháp cập nhật giao diện người dùng AsyncTask và giao diện người dùng

Tôi đang cố gắng kiểm tra đơn vị xử lý onClick của đơn đăng ký của tôi. Onclick thực hiện tìm kiếm đơn giản dựa vào API REST, trả về kết quả và cập nhật giao diện người dùng.

Chi tiết:

Onclick thực thi AsyncTask, doInBackground truy vấn REST API và trả về kết quả. OnPostExecute lấy kết quả và gán một ListAdapter mới cho ListView với dữ liệu.

Vấn đề:

Các onPostExecute không được gọi bằng các Runner thử nghiệm vì nó trên cùng một giao diện người dùng Chủ đề và ngăn chặn các cuộc gọi. Có một số mẫu để giải quyết vấn đề này. Tuy nhiên, nếu tôi đặt AsyncTask trong Runnable và sử dụng LatchCountdown để chờ kết quả, tôi nhận được ngoại lệ CalledFromWrongThread.

Có giải pháp nào tốt cho đơn vị kiểm tra AsyncTask cập nhật giao diện người dùng không? Hoặc một thiết kế có thể thử nghiệm hơn mà tôi có thể thực hiện?

+0

Điều này nghe có vẻ giống như một ActivityInstrumentationTestCase với tôi ... – dmon

+0

Điều này đang được thực hiện trong lớp ActivityInstrumentationTestCase2. – bcdennis72

+0

Asynctask của bạn sẽ chạy tốt sau đó ... – dmon

Trả lời

0

Ok, do đó giải pháp tôi đưa ra là thế này:

1.) Xác định một giao diện người nghe cho trước & bài sự kiện.
2.) Triển khai người nghe trên Hoạt động
2.) Xác định lớp trình bao bọc nhiệm vụ chấp nhận người nghe và người có AsyncTask bên trong được gọi là 'exec'.
3.) AsyncTask bên trong thông báo cho người nghe trên onPreExecute và onPostExecute
4.) Khi thông báo, Activity cập nhật giao diện người dùng của nó.

Đối với thử nghiệm trong Hoạt động:
1.) Tạo một phiên bản nối tiếp của lớp wrapper bởi kế thừa từ nó, sau đó trọng phương pháp exec để thực hiện theo thứ tự:
- thông báo cho người nghe nhiệm vụ như bắt đầu.
- thực hiện tác vụ.
- thông báo cho người nghe biết công việc đã hoàn tất.

Để kiểm tra phiên bản Không đồng bộ của tác vụ.
1.) Sử dụng CountdownLatch và Runnable trong phương pháp kiểm tra đơn vị. Vì sẽ không có bất kỳ cập nhật giao diện người dùng nào cần thiết, bạn sẽ không có bất kỳ WrongThreadExceptions nào.

+0

Bạn có lẽ thú vị về thảo luận tương tự [ở đây] (http://stackoverflow.com/questions/10491526/how-can-i-test-the -result-of-a-button-click-đó-thay đổi-the-hoạt động-xem-asy/10491965 # 10491965) và [ở đây] (http://stackoverflow.com/questions/8295003/best-way-to- manage-the-progressdialog-from-asynctask/8317071 # 8317071). – yorkw

0

Bạn muốn chạy thử nghiệm trên Ui Thread

runOnUiThread(new Runnable() { 
    public void run() { 
     onPostExecute(...) 

    } 
}); 
Các vấn đề liên quan