2015-10-22 19 views
5

Tôi đang đối mặt với một vấn đề rất lạ.Mockito mơ hồ - 0 Matchers dự kiến, 1 Recorded (InvalidUseOfMatchersException)

URL = "/my/specific/url/"; 
when(this.restHelperMock.post(
eq(myEnum), 
eq(this.config.apiEndpoint() + URL), 
any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent)); 

hoặc thậm chí bằng bao gồm

URL = "/my/specific/url/"; 
when(this.restHelperMock.post(
eq(myEnum), 
contains(this.config.apiEndpoint() + URL), 
any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent)); 

mang lại cho tôi

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
0 matchers expected, 1 recorded: 

This exception may occur if matchers are combined with raw values: 
    //incorrect: 
    someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
    //correct: 
    someMethod(anyObject(), eq("String by matcher")); 

For more info see javadoc for Matchers class. 

Thậm chí nếu tôi không sử dụng các biểu RAW.
Kỳ lạ nếu tôi thay đổi chứa phương pháp để:

URL = "/my/specific/url/"; 
when(this.restHelperMock.post(
eq(myEnum), 
contains(URL), 
any(JSONObject.class))).thenReturn(new JSONObject(myDesiredJsonContent)); 

bỏ qua thiết bị đầu cuối, nó hoạt động.

Các Config và RestHelper đều chế giễu:

this.restHelperMock = mock(RESTHelper.class); 
this.config = mock(MyBMWConfiguration.class); 

when(this.config.apiEndpoint()).thenReturn("http://host:port/api"); 

URL với ApiEndpoint bằng những gì tôi muốn thử, ngay cả khi nó sẽ không được, tôi sẽ nhận được một NullPointerException, vì sai chế giễu. Nhưng ở đây tôi không có bất kỳ ideea.

Cảm ơn câu trả lời của bạn.

+0

Là 'contains' và' eq' của bạn từ 'Mockito', bởi vì ngay cả' hamcrest' có cả hai. –

+0

Tôi đoán vấn đề có thể là bạn đang gọi một phương thức giả lập ('this.config.apiEndpoint()') trong lời gọi 'eq (...)'. Cố gắng đơn giản đặt URL hoàn chỉnh trong đó (http: // host: port/api/my/specific/url /) thay vì gọi một mô hình khác ở đó, điều này có thể gây nhầm lẫn cho Mockito, vì nó dựa vào trạng thái nội tại cho chế độ nhạo báng –

+0

@ FlorianSchaetz cảm ơn bạn, đó là giải pháp. Tôi không nghĩ chuyện này có thể xảy ra. Bạn có thể vui lòng viết một anwser, vì vậy tôi có thể chấp nhận nó? –

Trả lời

4

Sự cố có vẻ là bạn đang gọi phương thức được chế nhạo this.config.apiEndpoint() trong khi gọi eq (...). Cố gắng đơn giản đặt URL hoàn chỉnh trong đó (máy chủ: cổng/api/my/cụ thể/url) thay vì gọi một mô hình khác ở đó, điều này có thể gây nhầm lẫn cho Mockito, vì nó dựa vào trạng thái nội tại cho chế nhạo.

Để được khá trung thực, tôi không phải là sâu vào Mockito rằng tôi có thể giải thích tại sao điều này xảy ra, nhưng có lẽ tôi sẽ cố gắng để gỡ lỗi vào nó một ngày nào đó ;-)

Chỉnh sửa: Thật kỳ lạ, tôi dường như không thể tái tạo nó với một testcase đơn giản hơn. Dường như ở đây nhiều hơn là gặp mắt.

+1

Hmm, tôi hoàn toàn có thể thấy điều này có thể xảy ra như thế nào. Từ thời điểm matcher đầu tiên được gọi từ thời gian 'khi' được gọi, bạn KHÔNG muốn tương tác với bất kỳ mocks nào khác. Điều này là bởi vì khi bạn sử dụng matchers, có toàn bộ stack nội bộ của các cuộc gọi matcher được xây dựng. Được rồi, Florian. Để khắc phục điều này, bạn có thể thực hiện cuộc gọi đến 'this.config.apiEndpoint()' trên dòng của chính nó, trước dòng có 'khi'. –

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