2016-07-29 6 views
5

Как написать следующие Mockito Matchers, чтобы вызов не был двусмысленным?Mockito Unit Test Case Call is Ambiguous (нужно заставить его не быть двусмысленным)

Фактический вызов функции Я пытаюсь издеваться в моем коде:

//Variables 
String url = http://theServer:8080/oath2-v1/token; 
HttpEntity<String> request = new HttpEntity<String>("name=value",headers); 

//Method call I am trying to mock using Mockito 
response=cmsRestTemplate.exchange(url, HttpMethod.POST, request, DdsOAuthToken.class); 

Ниже приводится отрывок из моего модульного тестирования случае. Он содержит следующий издевавшийся вызов, эмулирующий вышеуказанный вызов, но, к сожалению, компилятор считает его неоднозначным и не компилируется.

//From the Unit Test... 
when(restTemplate.exchange(
    Matchers.anyString(), 
    Matchers.any(HttpMethod.class), 
    Matchers.any(HttpEntity.class), 
    Matchers.<Class<DdsOAuthToken>>any(), 
    Matchers.anyVararg()).thenReturn(response)); 

Я получаю ошибку следующим образом:

The method exchange(String, HttpMethod, HttpEntity<?>, Class<DdsOAuthToken>, Object[]) is ambiguous for the type RestTemplate 

Это апи вызов Spring RestTemplate. В частности, 2 апи называет это находит неоднозначные являются 2 следующих вызовов:

1. exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) 

2. exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Object... uriVariables) 

Я пытаюсь издеваться # 1 выше. Но компилятор Java не может определить, пытаюсь ли я позвонить №1 или №2. Точно как я должен писать Mockito, чтобы он знал, что я хочу # 1 выше, а не # 2?

ответ

0

Обычно это плохое решение, чтобы высмеять классы, которые вы не контролируете. Spring Framework поставляется с полезными классами, которые помогут вам проверить использование вами фреймворка.

Например, MockRestServiceServer - это фиктивный сервер, который даст действительные ответы для экземпляра RestTemplate, поэтому вам не нужно его издеваться.

An example from docs

RestTemplate restTemplate = new RestTemplate(); 

MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

mockServer.expect(requestTo("/greeting")) 
     .andRespond(withSuccess("Hello world", "text/plain")); 

// use RestTemplate ... 
1

Вы должны добавить слепок (Object[]) к параметру vararg. Это может иметь какое-то отношение к объявлению метода anyVararg. Но я не уверен в этом. Таким образом, ваш код должен быть:

//From the Unit Test... 
when(restTemplate.exchange(
    Matchers.anyString(), 
    Matchers.any(HttpMethod.class), 
    Matchers.any(HttpEntity.class), 
    Matchers.<Class<DdsOAuthToken>>any(), 
    (Object[]) Matchers.anyVararg()).thenReturn(response));