का उपयोग करने के बीच अंतर मैं वसंत बूट में नया हूं और यह समझने की कोशिश कर रहा हूं कि स्प्रिंगबूट में परीक्षण कैसे काम करता है।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!"));
}
}
धन्यवाद एक बहुत जवाब देने के लिए !!। इसलिए यदि मैं आपको सही ढंग से समझता हूं, तो इसका अर्थ यह है कि कोड स्निपेट केवल एप्लिकेशन के एमवीसी भाग का परीक्षण करते हैं।लेकिन टोड स्निपेट 1 पूर्ण अनुप्रयोग संदर्भ लोड करता है जबकि कोड स्निपेट 2 केवल नियंत्रक को स्कैन करता है। क्या ये सही है? नियंत्रक का परीक्षण करने के लिए कोड स्निपेट 1 को इकाई परीक्षण के रूप में माना जा सकता है? – Reshma
नहीं, यह सही नहीं है। 'स्प्रिंगबूटटेस्ट' आपके पूर्ण ऐप को लोड कर रहा है (कुछ विस्तार करने के लिए, डिफ़ॉल्ट रूप से यह एम्बेडेड कंटेनर शुरू नहीं करेगा यदि कोई उपलब्ध है, तो यही है कि 'वेब पर्यावरण' वहां है)। मैं यह नहीं कहूंगा कि 'स्प्रिंगबूटटेस्ट' नियंत्रक का एक यूनिट परीक्षण है, लेकिन वास्तव में एकीकरण परीक्षण है। 'WebMvcTest' वास्तव में आपके नियंत्रक का एक यूनिट परीक्षण है, इस अर्थ में कि यदि इसकी निर्भरता है, तो आपको उन्हें स्वयं प्रदान करना होगा (या तो किसी कॉन्फ़िगरेशन या किसी प्रकार का नकली)। –
प्रतिक्रिया के लिए फिर से धन्यवाद। मैंने प्रश्न संपादित किया है और कोड स्निपेट जोड़ा है 3. आपने उल्लेख किया है कि @SpringBootTest एनोटेशन एकीकरण परीक्षण के लिए अधिक उपयोग किया जाता है। मुझे विश्वास है कि स्निपेट 3 इसे प्रदर्शित करता है। तो अगर स्निपेट 3 में एकीकरण परीक्षण किया जाता है तो स्निपेट 2 क्या करता है? स्निपेट 2 स्प्रिंगबूटटेस्ट एनोटेशन और एक नकली वातावरण (WenEnvironment विशेषता का डिफ़ॉल्ट मान) का उपयोग करता है। साथ ही, स्निपेट 3 एम्बेडेड सर्वर शुरू करता है और वास्तव में HTTP कॉल करता है जबकि स्निपेट 2 ऐसा नहीं करता है। तो इस पर विचार करते हुए, स्निपेट 2 को यूनिट टेस्ट नहीं माना जा सकता है? – Reshma