2016-07-04 7 views
6

Ich habe eine Serviceklasse, im Frühjahr schreiben, mit einigen Methoden. Eines davon dient als ein resful Verbraucher wie unten:Mock Resttemplate, um einen Dienst als 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(); 
     } 

Ich möchte Mockito verwenden meinen Dienst zu verspotten, aber jede Methode, die ein neues RestTemplate mit restuful Serverinstanz in Wechselwirkung treten. Ich muss eine statische Klasse erstellen, um es in meinen Dienst zu injizieren?

+0

Welchen spöttischen Rahmen verwenden Sie? Außerdem wäre es ** viel ** einfacher, wenn Sie die Abhängigkeitsinjektion verwenden könnten, um die 'RestTemplate' zu ​​injizieren, anstatt eine neue zu erstellen. – g00glen00b

Antwort

6

Einer der Vorteile von Dependency-Injection besteht darin, dass Sie Ihre Abhängigkeiten leicht auffrischen können. In Ihrem Fall wäre es viel einfacher sein, eine RestTemplate Bohne zu erstellen:

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

Und anstelle von new RestTemplate() in Ihrem Client verwenden, sollten Sie verwenden:

@Autowired 
private RestTemplate restTemplate; 

Für die Unit-Tests mit Mockito Sie‘ ll haben die RestTemplate, zum Beispiel verspotten, indem Sie:

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

in diesem Fall Mockito wird verspotten und injizieren die RestTemplate Bohne in Ihre Client. Wenn Sie nicht spötteln und durch Reflektion injizieren möchten, können Sie immer einen separaten Konstruktor oder Setter verwenden, um den RestTemplate Mock zu injizieren.

Jetzt können Sie einen Test wie folgt schreiben:

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

Sie werden wahrscheinlich mehr testen wollen, als das, aber es gibt Ihnen eine Grundidee.

+0

Ja, das ist der Weg! Ich danke dir sehr –

0

Sie können restTemplate mit Mockito nicht vortäuschen, weil Instanz mit einem new Schlüsselwort erstellt wird.

Stattdessen sollten Sie versuchen, ein Mock-Objekt in der Testklasse zu erstellen:

mock(RestTemplate.class) 

und an die Service-Klasse übergeben.

Ich hoffe, es hilft.

+0

Ich muss eine statische Calss verwenden, die eine restTemplate instanziieren und injizieren? –

+0

Ich würde lieber das Feld hinzufügen, um 'restTemplate' zu ​​speichern und package-visible Konstruktor zu erstellen, um den Mock zu injizieren. – mrtowel

Verwandte Themen