2016-07-04 53 views
6

Ho una classe di servizio, scrivere in primavera, con alcuni metodi. Uno di questi agisce come un consumatore resful come di seguito:mock Resttemplate per testare un servizio come restFul client

..... 
     HttpEntity request = new HttpEntity<>(getHeadersForRequest()); 
     RestTemplate restTemplate = new RestTemplate(); 
     String url = ENDPOINT_URL.concat(ENDPOINT_API1); 

     UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) 
       .queryParam("param1", parameter1); 
     ReportModel infoModel = null; 
     try{ 
      infoModel = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, ReportModel.class).getBody(); 
     }catch (HttpClientErrorException | HttpServerErrorException e){ 
      e.printStackTrace(); 
     } 

voglio usare Mockito prendere in giro il mio servizio, ma ogni metodo che interagiscono con istanza del server restuful un nuovo RestTemplate. Devo creare una classe statica per inserirla nel mio servizio?

+0

Quale framework di derisione utilizzi? Inoltre, sarebbe molto ** molto più semplice se si potesse usare l'iniezione di dipendenza per iniettare il 'RestTemplate' piuttosto che crearne uno nuovo. – g00glen00b

risposta

6

Uno dei vantaggi dell'iniezione delle dipendenze è quello di essere in grado di prendere facilmente in giro le proprie dipendenze. Nel tuo caso, sarebbe molto più facile per creare un RestTemplate di fagioli:

@Bean 
public RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

E invece di utilizzare new RestTemplate() nel client si dovrebbe usare:

@Autowired 
private RestTemplate restTemplate; 

Per il test di unità con Mockito te' ll deve deridere il RestTemplate, per esempio usando:

@RunWith(MockitoJUnitRunner.class) 
public class ClientTest { 
    @InjectMocks 
    private Client client; 
    @Mock 
    private RestTemplate restTemplate; 
} 

in questo caso Mockito scherniranno e iniettare il fagiolo RestTemplate in il tuo Client. Se non ti piace prendere in giro e iniettare attraverso il riflesso, puoi sempre fare un costruttore o setter separato per iniettare il simulato RestTemplate.

Ora è possibile scrivere un test come questo:

client.doStuff(); 
verify(restTemplate).exchange(anyString(), eq(HttpMethod.GET), any(HttpModel.class), eq(ReportModel.class)); 

Probabilmente si vorrà mettere alla prova più di questo, ma ti dà un'idea di base.

+0

Sì, questo è il modo! Grazie mille –

0

Non è possibile simulare restTemplate utilizzando Mockito, perché l'istanza viene creata con una parola chiave new.

Invece si dovrebbe cercare di creare un oggetto fittizio nella classe di test:

mock(RestTemplate.class) 

e passarlo alla classe di servizio.

Spero che aiuti.

+0

Devo usare un calss statico che istanzia un restTemplate e lo inietti? –

+0

Preferisco aggiungere il campo per memorizzare 'restTemplate' e creare il costruttore del package-visible per iniettare il mock. – mrtowel