2010-12-28 34 views
9

Tôi gặp sự cố với việc chế nhạo khách hàng Apache Http. Cố gắng tạo mô hình sau:Tại sao đối tượng giả Mockito của tôi sử dụng thực sự thực hiện

DefaultHttpClient httpClient = Mockito.mock(DefaultHttpClient.class); 

Không tạo mô hình đúng. Dòng trên được thực hiện mà không ngoại lệ, nhưng khi tôi cố gắng còn sơ khai một số hành vi:

Mockito.when(httpClient.execute(Mockito.<HttpUriRequest>anyObject())).thenReturn(null); 

tôi nhận được một ngoại lệ từ một phương pháp trong AbstractHttpClient:

Exception in thread "main" java.lang.IllegalArgumentException: Request must not be null. 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:572) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554) 

Tại sao cuộc gọi để thực hiện bên trong Mockito. khi được chuyển đến AbstractHttpClient?

Tôi đã tìm ra giải pháp cho vấn đề cụ thể này: sử dụng giao diện HttpClient thay vì cố gắng giả lập lớp con cụ thể. Đây là một giải pháp tốt hơn nhiều trong trường hợp này, nhưng tôi tự hỏi nói chung những gì đang xảy ra ở đây? Tại sao tôi không thể chế nhạo lớp bê tông này đúng với Mockito? Có điều gì đặc biệt về DefaultHttpClient? Có những trường hợp khác mà Mockito không thể giả lập các lớp bê tông?

Tôi đang sử dụng Mockito 1.8.5, Apache httpclient 4.0.3, Apache http lõi 4.1, JDK 1.6.0 trên OSX

Trả lời

15

Một số phương pháp trên AbstractHttpClient là cuối cùng và do đó sẽ không được chế giễu. IMO, hành vi này là lý do số 1 không mô phỏng các lớp bê tông.

+0

Vậy đó, cảm ơn! – auramo

3

Hãy thử cú pháp này (chỉ cần một mẫu, không phải là một mã thực):

import static Mockito.*; 
// ... 
HttpClient httpClient = mock(HttpClient.class); 
doReturn(null).when(httpClient).execute(anyObject()). 

Xem liên kết này để giải thích rõ hơn về vấn đề/giải pháp: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn(java.lang.Object)

+0

Như tôi đã đề cập ở trên, chế nhạo chống lại giao diện HttpClient hoạt động, vấn đề là với lớp bê tông DefaultHttpClient. Trong trường hợp này, tất nhiên là khuyến khích giả lập giao diện và không được thực thi mặc định. Tôi chỉ tò mò tại sao việc chế giễu không hiệu quả; đôi khi bạn sẽ phải giả lập các lớp bê tông và kiến ​​thức này có thể trở nên hữu ích. – auramo

+0

Bạn vẫn không thể ghi đè quá trình tạo tĩnh của HttpClient nếu đó là mã của bạn. tức là HttpClients.createDefault() – RonanOD

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