2016-10-05 12 views
18

का उपयोग करने के बीच अंतर मैं वसंत बूट में नया हूं और यह समझने की कोशिश कर रहा हूं कि स्प्रिंगबूट में परीक्षण कैसे काम करता है।SpringBootTest के साथ MockMvc का उपयोग करने और WebMvcTest

कोड स्निपेट 1:

@RunWith(SpringRunner.class) 
@WebMvcTest(HelloController.class) 
public class HelloControllerApplicationTest { 
    @Autowired  
    private MockMvc mvc; 

    @Test 
    public void getHello() throws Exception { 
     mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) 
       .andExpect(status().isOk()) 
       .andExpect(content().string(equalTo("Greetings from Spring Boot!"))); 
    } 
} 

यह परीक्षण @WebMvcTest एनोटेशन जो मेरा मानना ​​है कि सुविधा टुकड़ा परीक्षण और के लिए है का उपयोग करता है मैं थोड़ा क्या निम्नलिखित दो कोड स्निपेट के बीच अंतर है के बारे में उलझन में हूँ केवल एक वेब अनुप्रयोग की एमवीसी परत का परीक्षण करता है।

कोड स्निपेट 2:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
public class HelloControllerTest { 

    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void getHello() throws Exception { 
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) 
      .andExpect(status().isOk()) 
      .andExpect(content().string(equalTo("Greetings from Spring Boot!"))); 
    } 
} 

यह परीक्षण @SpringBootTest एनोटेशन और एक MockMvc उपयोग करता है। तो यह कोड स्निपेट 1 से अलग कैसे है? यह अलग-अलग क्या करता है?

संपादित करें: कोड स्निपेट 3 जोड़ना

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
public class HelloControllerIT { 

@LocalServerPort 
private int port; 

private URL base; 

@Autowired 
private TestRestTemplate template; 

@Before 
public void setUp() throws Exception { 
    this.base = new URL("http://localhost:" + port + "/"); 
} 

@Test 
public void getHello() throws Exception { 
    ResponseEntity<String> response = template.getForEntity(base.toString(), 
      String.class); 
    assertThat(response.getBody(), equalTo("Greetings from Spring Boot!")); 
} 
} 

उत्तर

16

बहुत बढ़िया सवाल (स्प्रिंग दस्तावेज में एकीकरण परीक्षण का एक उदाहरण के रूप में इस मिला)।

@SpringBootTest सामान्य परीक्षण एनोटेशन है। यदि आप कुछ ऐसा ढूंढ रहे हैं जो 1.4 से पहले एक ही चीज़ करता है, तो यही वह है जिसे आप उपयोग करना चाहिए। यह स्लाइसिंग का उपयोग नहीं करता है, जिसका अर्थ है कि यह आपका पूरा एप्लिकेशन संदर्भ शुरू करेगा और घटक स्कैनिंग को कस्टमाइज़ नहीं करेगा।

@WebMvcTest केवल आपके द्वारा परिभाषित नियंत्रक और एमवीसी आधारभूत संरचना को स्कैन करने जा रहा है। बस। इसलिए यदि आपके नियंत्रक की आपकी सेवा परत से अन्य बीन्स की निर्भरता है, तो परीक्षण तब तक शुरू नहीं होगा जब तक कि आप या तो उस कॉन्फ़िगर को लोड न करें या इसके लिए नकली न करें। यह बहुत तेज है क्योंकि हम केवल आपके ऐप का एक छोटा सा हिस्सा लोड करते हैं। यह एनोटेशन स्लाइसिंग का उपयोग करता है।

Reading the doc शायद आपकी मदद भी कर सकता है।

+0

धन्यवाद एक बहुत जवाब देने के लिए !!। इसलिए यदि मैं आपको सही ढंग से समझता हूं, तो इसका अर्थ यह है कि कोड स्निपेट केवल एप्लिकेशन के एमवीसी भाग का परीक्षण करते हैं।लेकिन टोड स्निपेट 1 पूर्ण अनुप्रयोग संदर्भ लोड करता है जबकि कोड स्निपेट 2 केवल नियंत्रक को स्कैन करता है। क्या ये सही है? नियंत्रक का परीक्षण करने के लिए कोड स्निपेट 1 को इकाई परीक्षण के रूप में माना जा सकता है? – Reshma

+0

नहीं, यह सही नहीं है। 'स्प्रिंगबूटटेस्ट' आपके पूर्ण ऐप को लोड कर रहा है (कुछ विस्तार करने के लिए, डिफ़ॉल्ट रूप से यह एम्बेडेड कंटेनर शुरू नहीं करेगा यदि कोई उपलब्ध है, तो यही है कि 'वेब पर्यावरण' वहां है)। मैं यह नहीं कहूंगा कि 'स्प्रिंगबूटटेस्ट' नियंत्रक का एक यूनिट परीक्षण है, लेकिन वास्तव में एकीकरण परीक्षण है। 'WebMvcTest' वास्तव में आपके नियंत्रक का एक यूनिट परीक्षण है, इस अर्थ में कि यदि इसकी निर्भरता है, तो आपको उन्हें स्वयं प्रदान करना होगा (या तो किसी कॉन्फ़िगरेशन या किसी प्रकार का नकली)। –

+0

प्रतिक्रिया के लिए फिर से धन्यवाद। मैंने प्रश्न संपादित किया है और कोड स्निपेट जोड़ा है 3. आपने उल्लेख किया है कि @SpringBootTest एनोटेशन एकीकरण परीक्षण के लिए अधिक उपयोग किया जाता है। मुझे विश्वास है कि स्निपेट 3 इसे प्रदर्शित करता है। तो अगर स्निपेट 3 में एकीकरण परीक्षण किया जाता है तो स्निपेट 2 क्या करता है? स्निपेट 2 स्प्रिंगबूटटेस्ट एनोटेशन और एक नकली वातावरण (WenEnvironment विशेषता का डिफ़ॉल्ट मान) का उपयोग करता है। साथ ही, स्निपेट 3 एम्बेडेड सर्वर शुरू करता है और वास्तव में HTTP कॉल करता है जबकि स्निपेट 2 ऐसा नहीं करता है। तो इस पर विचार करते हुए, स्निपेट 2 को यूनिट टेस्ट नहीं माना जा सकता है? – Reshma

12

@SpringBootTest एनोटेशन जाने के लिए और एक मुख्य विन्यास वर्ग (उदाहरण के लिए @SpringBootApplication के साथ) के लिए देखो, और प्रयोग है कि एक स्प्रिंग आवेदन संदर्भ शुरू करने के लिए करने के लिए स्प्रिंग बूट बताता है। SpringBootTest पूर्ण एप्लिकेशन लोड करता है और सभी बीन्स इंजेक्ट करता है जो धीमा हो सकता है।

@WebMvcTest - नियंत्रक परत का परीक्षण करने के लिए और आपको नकली ऑब्जेक्ट्स का उपयोग करके आवश्यक शेष निर्भरताओं को प्रदान करने की आवश्यकता है।

आपके संदर्भ के लिए नीचे कुछ और टिप्पणियां।

आवेदन का परीक्षण स्लाइस कभी-कभी आप ऑटो को विन्यस्त पूरे आवेदन के बजाय एक साधारण आवेदन के "टुकड़ा" परीक्षण करना चाहते हैं। स्प्रिंग बूट 1.4 द्वारा प्रस्तुत 4 नए परीक्षण एनोटेशन:

@WebMvcTest - for testing the controller layer 
@JsonTest - for testing the JSON marshalling and unmarshalling 
@DataJpaTest - for testing the repository layer 
@RestClientTests - for testing REST clients 

अधिक जानकारी के लिए देखें: https://spring.io/guides/gs/testing-web/

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