2014-09-17 10 views
23

MockMvc और RestTemplate दोनों वसंत और जुनीट के साथ एकीकरण परीक्षण के लिए उपयोग किए जाते हैं।एकीकरण परीक्षणों में MockMvc और RestTemplate के बीच अंतर

प्रश्न है: उनके बीच क्या अंतर है और जब हमें किसी एक को चुनना चाहिए?

यहाँ दोनों विकल्पों के उदाहरण हैं:

//MockMVC example 
mockMvc.perform(get("/api/users")) 
      .andExpect(status().isOk()) 
      (...) 

//RestTemplate example 
ResponseEntity<User> entity = restTemplate.exchange("/api/users", 
      HttpMethod.GET, 
      new HttpEntity<String>(...), 
      User.class); 
assertEquals(HttpStatus.OK, entity.getStatusCode()); 

उत्तर

18

रूप this लेख में कहा था कि आप MockMvc का उपयोग करना चाहिए जब आप आवेदन के सर्वर साइड परीक्षण करना चाहते हैं:

वसंत MVC टेस्ट नकली अनुरोध और spring-test से प्रतिक्रिया पर बनाता है और एक की आवश्यकता नहीं है चलने वाले सर्वलेट कंटेनर। मुख्य अंतर यह है कि वास्तविक स्प्रिंग एमवीसी कॉन्फ़िगरेशन टेस्टकॉन्टेक्स्ट फ्रेमवर्क के माध्यम से लोड किया जाता है और यह अनुरोध वास्तव में DispatcherServlet और सभी समान वसंत एमवीसी आधारभूत संरचना का उपयोग करके किया जाता है जो रनटाइम पर उपयोग किया जाता है।

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration("servlet-context.xml") 
public class SampleTests { 

    @Autowired 
    private WebApplicationContext wac; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
    this.mockMvc = webAppContextSetup(this.wac).build(); 
    } 

    @Test 
    public void getFoo() throws Exception { 
    this.mockMvc.perform(get("/foo").accept("application/json")) 
     .andExpect(status().isOk()) 
     .andExpect(content().mimeType("application/json")) 
     .andExpect(jsonPath("$.name").value("Lee")); 
    }} 

और RestTemplate जब आप बाकी क्लाइंट-साइड परीक्षण करने के लिए आवेदन चाहते हैं का उपयोग करना चाहिए:

उदाहरण के लिए

आप कोड RestTemplate का उपयोग कर है, तो

, आप ' शायद आप इसका परीक्षण करना चाहते हैं और इसके लिए आप एक रनिंग सर्वर को लक्षित कर सकते हैं या RestTemplate को मॉक कर सकते हैं। क्लाइंट-साइड आरईएसटी टेस्ट सपोर्ट एक तीसरा विकल्प प्रदान करता है, जो वास्तविक RestTemplate का उपयोग करना है, लेकिन इसे कस्टम ClientHttpRequestFactory के साथ कॉन्फ़िगर करें जो वास्तविक अनुरोधों के विरुद्ध अपेक्षाओं की जांच करता है और प्रतिक्रिया प्रतिक्रिया देता है।

उदाहरण:

RestTemplate restTemplate = new RestTemplate(); 
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

mockServer.expect(requestTo("/greeting")) 
    .andRespond(withSuccess("Hello world", "text/plain")); 

// use RestTemplate ... 

mockServer.verify(); 

भी this example

22

MockMvc के साथ, आप आम तौर पर एक पूरी वेब अनुप्रयोग संदर्भ की स्थापना और HTTP अनुरोध और प्रतिक्रियाओं मजाक कर रहे हैं। इसलिए, हालांकि नकली DispatcherServlet ऊपर और चल रहा है, यह सिमुलेट करते हुए कि आपका एमवीसी स्टैक कैसे काम करेगा, कोई वास्तविक नेटवर्क कनेक्शन नहीं है।

RestTemplate के साथ, आपको भेजे गए HTTP अनुरोधों को सुनने के लिए आपको एक वास्तविक सर्वर उदाहरण तैनात करना होगा।

8

पढ़ यह दोनों RestTemplate और MockMvc उपयोग करने के लिए संभव है!

यह उपयोगी है यदि आपके पास एक अलग ग्राहक है जहां आप पहले से ही जावा ऑब्जेक्ट्स के थकाऊ मैपिंग को URL पर और जेसन से कनवर्ट कर रहे हैं, और आप इसे अपने MockMVC परीक्षणों के लिए पुन: उपयोग करना चाहते हैं।

तरीके से ऐसा करने के लिए है:

@RunWith(SpringRunner.class) 
@ActiveProfiles("integration") 
@WebMvcTest(ControllerUnderTest.class) 
public class MyTestShould { 

    @Autowired 
    private MockMvc mockMvc; 

    @Test 
    public void verify_some_condition() throws Exception { 

     MockMvcClientHttpRequestFactory requestFactory = new MockMvcClientHttpRequestFactory(mockMvc); 
     RestTemplate restTemplate = new RestTemplate(requestFactory); 

     ResponseEntity<SomeClass> result = restTemplate.getForEntity("/my/url", SomeClass.class); 

     [...] 
    } 

} 
+0

मेरी उपयोग के मामले के लिए, मुझे लगता है कि यह सबसे अच्छा तरीका है जब HATEOS (विशेष रूप से) खेलने में आता है के बाद से RestTemplate प्रतिक्रिया की ORM मानचित्रण बनाता है और अधिक सरल। – fquinner

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