2016-07-29 26 views
5

Jak mam napisać następujące Mockito Matchery, aby wywołanie nie było niejednoznaczne?Wywołanie zestawu testowego urządzenia Mockito jest niejednoznaczne (trzeba go ustawić, aby nie było niejednoznaczne).

Faktyczne wywołanie funkcji Próbuję mock w moim kodu jest:

//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); 

Poniżej znajduje się fragment z mojego przypadku testów jednostkowych. Zawiera następujące fałszywe połączenie emulujące powyższe wywołanie, ale niestety kompilator uważa, że ​​jest niejednoznaczny i nie będzie kompilowany.

//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)); 

Błąd pojawia się następująco:

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

To Wiosna RestTemplate wywołanie API. Konkretnie nazywa 2 api stwierdzi niejednoznaczne są 2 następujące połączenia:

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) 

Próbuję mock nr 1 powyżej. Ale kompilator Java nie może stwierdzić, czy próbuję wywołać # 1 lub # 2. Dokładnie jak mam napisać Mockito, aby wiedział, że chcę # 1 powyżej, a nie # 2?

Odpowiedz

0

Zazwyczaj jest to zła decyzja o kpieniu z zajęć, nad którymi nie masz kontroli. Wiosenne środowisko zawiera klasy narzędziowe, które pomagają przetestować wykorzystanie struktury.

Na przykład MockRestServiceServer jest serwerem typu dummy, który będzie dawał prawidłowe odpowiedzi dla instancji RestTemplate, więc nie trzeba go udawać.

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

Trzeba dodać obsady (Object[]) do parametru vararg. Może to mieć coś wspólnego z deklaracją metody anyVararg. Ale nie jestem tego pewien. Twój kod powinien być:

//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));