2016-07-04 16 views
6

Bir hizmet sınıfım var, bazı yöntemlerle ilkbaharda yazarım.mock resttemplate bir servisi restFul client olarak test etmek için

..... 
     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(); 
     } 

benim hizmetini alay Mockito kullanmak istiyorum ama restuful sunucu örneği yeni RestTemplate ile etkileşim her yöntemi: Bu biri resful tüketici aşağıda gibi davranır. Bunu benim hizmetime enjekte etmek için statik bir sınıf oluşturmalıyım?

+0

Hangi alaycı çerçeveyi kullanıyorsunuz? Ayrıca, bağımlılık enjeksiyonu yeni bir tane oluşturmaktan çok 'RestTemplate' enjekte etmek için kullanabilmeniz çok daha kolay olacaktır. – g00glen00b

cevap

6

Bağımlılık enjeksiyonunun faydalarından biri, bağımlılıklarınızı kolayca atabilmektir. Mockito sen' ile birim test için

@Autowired 
private RestTemplate restTemplate; 

:

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

Ve istemci new RestTemplate() kullanmanın yerine

kullanmalısınız: Senin durumunda bir RestTemplate fasulye oluşturmak için çok daha kolay olurdu

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

Bu durumda mockito alay edecek ve içinde RestTemplate fasulye enjekte: kullanılarak örneğin RestTemplate alay gerekecek Client. Eğer alay etmekten ve yansımayı enjekte etmekten hoşlanmıyorsanız, her zaman RestTemplate alayını enjekte etmek için ayrı bir kurucu veya ayarlayıcıya gidebilirsiniz.

Şimdi böyle bir test yazabilirsiniz:

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

Muhtemelen bundan daha test etmek istersiniz, ama size temel bir fikir verir.

+0

Evet, yol bu! Çok teşekkür ederim –

0

new anahtar kelimesi ile örnek oluşturulduğundan, Mockito kullanarak restTemplate alamayacaksınız.

mock(RestTemplate.class) 

ve hizmet sınıfına geçmek:

yerine test sınıfında sahte nesne oluşturmak için çalışmalısınız.

Yardım edin.

+0

Bir restTemplate'ı başlatan ve enjekte eden statik cals'ları kullanmalı mıyım? –

+0

"RestTemplate" öğesini depolamak ve alayın enjekte edilmesi için paket görünür kurucu oluşturmak için alanı eklemeyi tercih ederim. – mrtowel

İlgili konular