2016-07-04 5 views
6

मेरे पास एक सेवा वर्ग है, कुछ तरीकों के साथ वसंत में लिखें। इस का एक एक resful उपभोक्ता नीचे की तरह के रूप में कार्य:मॉक resttemplate आराम के रूप में एक सेवा का परीक्षण करने के लिए ग्राहक क्लाइंट

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

मैं Mockito उपयोग करने के लिए मेरी सेवा उपहास करने के लिए चाहते हैं, लेकिन हर विधि कि restuful सर्वर उदाहरण एक नया RestTemplate के साथ बातचीत। मुझे अपनी सेवा में इंजेक्ट करने के लिए एक स्थिर वर्ग बनाना है?

+0

आप किस मॉकिंग फ्रेमवर्क का उपयोग करते हैं? साथ ही, यह ** बहुत आसान होगा यदि आप एक नया निर्माण करने के बजाय 'RestTemplate' इंजेक्ट करने के लिए निर्भरता इंजेक्शन का उपयोग कर सकते हैं। – g00glen00b

उत्तर

6

निर्भरता इंजेक्शन से लाभों में से एक यह है कि आप अपनी निर्भरताओं को आसानी से नकल कर सकें।

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

और अपने ग्राहक में new RestTemplate() का उपयोग करने का जगह में आप का उपयोग करना चाहिए:

@Autowired 
private RestTemplate restTemplate; 

Mockito आप 'के साथ इकाई परीक्षण के लिए अपने मामले में यह एक RestTemplate सेम बनाने के लिए एक बहुत आसान होगा

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

इस मामले में Mockito नकली जाएगा और में RestTemplate सेम इंजेक्षन: का उपयोग करके उदाहरण के लिए RestTemplate नकली, करने के लिए होगा आपका Client। यदि आपको प्रतिबिंब के माध्यम से मॉकिंग और इंजेक्शन पसंद नहीं है तो आप RestTemplate नकली इंजेक्ट करने के लिए हमेशा एक अलग कन्स्ट्रक्टर या सेटर के लिए जा सकते हैं।

अब तुम इस तरह एक परीक्षण लिख सकते हैं:

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

आप शायद उससे कहीं अधिक परीक्षण करने के लिए चाहता हूँ, लेकिन यह आपको एक बुनियादी विचार देता है।

+0

हाँ, यह वैसे ही है! बहुत बहुत धन्यवाद –

0

आप मॉकिटो का उपयोग करके restTemplate पर नकल करने में सक्षम नहीं होंगे, क्योंकि उदाहरण new कीवर्ड के साथ बनाया गया है।

इसके बजाय आप परीक्षण वर्ग में एक नकली वस्तु बनाने के लिए प्रयास करना चाहिए:

mock(RestTemplate.class) 

और यह सेवा वर्ग के लिए गुजरती हैं।

उम्मीद है कि यह मदद करता है।

+0

मुझे एक स्थिर cals का उपयोग करना है जो एक restTemplate को तुरंत चालू करें और इसे इंजेक्ट करें? –

+0

मैं 'restTemplate' को स्टोर करने के लिए फ़ील्ड जोड़ना चाहता हूं और नकली इंजेक्ट करने के लिए पैकेज-दृश्य कन्स्ट्रक्टर बनाना चाहता हूं। – mrtowel

संबंधित मुद्दे

 संबंधित मुद्दे