इस श्रृंखला के पहले लेख में, हमने स्प्रिंग बूट, क्लाउडिनरी, डॉकर और पोस्टग्रेएसक्यूएल का उपयोग करके एक मजबूत छवि अपलोडर का निर्माण किया। हमने प्रोजेक्ट की स्थापना से लेकर छवि और जानकारी को सहेजने वाले अंतिम बिंदु तक अनुरोध करने तक सब कुछ कवर किया। यदि आपने अभी तक वह लेख नहीं पढ़ा है, तो मैं अत्यधिक अनुशंसा करता हूं कि जिस एप्लिकेशन के साथ हम काम करेंगे उसका ठोस आधार प्राप्त करने के लिए वहां से शुरुआत करें।
अब, यह सुनिश्चित करने का समय आ गया है कि हमारा एप्लिकेशन विश्वसनीय है और समय के साथ अपनी अखंडता बनाए रखता है। यह हमें सॉफ्टवेयर विकास के एक महत्वपूर्ण पहलू पर लाता है: परीक्षण। इस लेख में, हम अपनी छवि अपलोडर एपीआई के लिए यूनिट परीक्षण लिखने पर ध्यान केंद्रित करेंगे। हम पता लगाएंगे कि निर्भरता का नकल कैसे किया जाए, और परीक्षण लिखें जो हमारी सेवा के विभिन्न हिस्सों को कवर करते हैं।
यूनिट परीक्षण न केवल बग को जल्दी पकड़ने में मदद करता है बल्कि यह भी सुनिश्चित करता है कि हमारा कोड रखरखाव योग्य और स्केलेबल है। इस लेख के अंत तक, आपके पास अपने छवि अपलोडर एपीआई के लिए परीक्षणों का एक व्यापक सूट होगा, जिससे आपको विश्वास होगा कि आपका एप्लिकेशन उम्मीद के मुताबिक काम करता है।
आइए यूनिट परीक्षण की दुनिया में उतरें और अपनी छवि अपलोडर एपीआई को बुलेटप्रूफ बनाएं!
मैं जावा के लिए एक्सटेंशन पैक के साथ VSCode का उपयोग कर रहा हूं। अब हम अपने परीक्षण लिखने के लिए तैयार हैं।
यदि आप किसी अन्य आईडीई का उपयोग कर रहे हैं, तो यहां JUnit5 दस्तावेज़ में उन सभी के लिए समर्थन देखें।
बुकसर्विस क्लास पर राइट-क्लिक करें, टेस्ट पर जाएं पर क्लिक करें, और मेनू से उन तरीकों का चयन करें जिनके लिए आप टेस्ट जेनरेट करना चाहते हैं।
नीचे दी गई फ़ाइल की तरह एक समान फ़ाइल तैयार की जाएगी:
import org.junit.jupiter.api.Test; public class BookServiceTest { @Test void testAddBook() { } }
याद रखें, इस लेख के लिए, हम परीक्षण के AAA पैटर्न (अरेंज - एक्ट - एसर्ट) का उपयोग करने जा रहे हैं।
@ExtendWith(MockitoExtension.class) public class BookServiceTest { @Mock private BookRepository bookRepository; @Mock private Cloudinary cloudinary; @Mock private MultipartFile multipartFile; @Mock private Uploader uploader; @Captor private ArgumentCaptorbookArgumentCaptor; @InjectMocks private BookService bookService; }
@ExtendWith(MockitoExtension.class) public class BookServiceTest { @Mock private BookRepository bookRepository; @Mock private Cloudinary cloudinary; @Mock private MultipartFile multipartFile; @Mock private Uploader uploader; @Captor private ArgumentCaptorbookArgumentCaptor; @InjectMocks private BookService bookService; @Nested class AddBook { @Test void shouldCreateANewBook() throws Exception { // Arrange Map uploadResult = Map.of("url", "http://example.com/image.jpg"); when(cloudinary.uploader()).thenReturn(uploader); when(uploader.upload(any(File.class), anyMap())).thenReturn(uploadResult); Book book = new Book(); book.setName("Test Book"); book.setImgUrl(uploadResult.get("url").toString()); when(bookRepository.save(any(Book.class))).thenReturn(book); when(multipartFile.getOriginalFilename()).thenReturn("test.jpg"); when(multipartFile.getBytes()).thenReturn("test content".getBytes()); // Act Book result = bookService.addBook("Test Book", multipartFile); // Assert assertNotNull(result); assertEquals("Test Book", result.getName()); assertEquals("http://example.com/image.jpg", result.getImgUrl()); } @Test void shouldCallRepositorySave() throws Exception { // Arrange Map uploadResult = Map.of("url", "http://example.com/image.jpg"); when(cloudinary.uploader()).thenReturn(uploader); when(uploader.upload(any(File.class), anyMap())).thenReturn(uploadResult); Book book = new Book(); book.setName("Test Book"); book.setImgUrl(uploadResult.get("url").toString()); when(bookRepository.save(any(Book.class))).thenReturn(book); when(multipartFile.getOriginalFilename()).thenReturn("test.jpg"); when(multipartFile.getBytes()).thenReturn("test content".getBytes()); // Act bookService.addBook("Test Book", multipartFile); // Assert verify(bookRepository, times(1)).save(bookArgumentCaptor.capture()); Book capturedBook = bookArgumentCaptor.getValue(); assertEquals("Test Book", capturedBook.getName()); assertEquals("http://example.com/image.jpg", capturedBook.getImgUrl()); } @Test void shouldFailTheUpload() throws Exception { // Arrange when(multipartFile.getOriginalFilename()).thenReturn("test.jpg"); when(multipartFile.getBytes()).thenReturn("test content".getBytes()); when(cloudinary.uploader()).thenReturn(uploader); when(uploader.upload(any(File.class), anyMap())).thenThrow(IOException.class); // Act & Assert ResponseStatusException exception = assertThrows(ResponseStatusException.class, () -> { bookService.addBook("Test Book", multipartFile); }); assertEquals(HttpStatus.BAD_GATEWAY, exception.getStatusCode()); assertEquals("Failed to upload the file.", exception.getReason()); } } }
package cloudinary.upload.imageUpload.controllers; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.server.ResponseStatusException; import cloudinary.upload.imageUpload.configs.GlobalExceptionHandler; import cloudinary.upload.imageUpload.entities.Book; import cloudinary.upload.imageUpload.services.BookService; @ExtendWith(MockitoExtension.class) public class BookControllerTest { @Mock private BookService bookService; @InjectMocks private BookController bookController; private MockMvc mockMvc; @Nested class AddBook { @Test void shouldReturnSuccess() throws Exception { // Arrange MockMultipartFile image = new MockMultipartFile("imgUrl", "test.jpg", MediaType.IMAGE_JPEG_VALUE, "test content".getBytes()); Book book = new Book(); book.setName("Test Book"); book.setImgUrl("http://example.com/image.jpg"); when(bookService.addBook(any(String.class), any(MockMultipartFile.class))).thenReturn(book); mockMvc = MockMvcBuilders.standaloneSetup(bookController).build(); // Act & Assert mockMvc.perform(multipart("/addBook") .file(image) .param("name", "Test Book")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Test Book")) .andExpect(jsonPath("$.imgUrl").value("http://example.com/image.jpg")); } @Test void shouldFailToUploadImage() throws Exception { // Arrange MockMultipartFile image = new MockMultipartFile("imgUrl", "test.jpg", MediaType.IMAGE_JPEG_VALUE, "test content".getBytes()); when(bookService.addBook(any(String.class), any(MockMultipartFile.class))) .thenThrow(new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to upload the file.")); mockMvc = MockMvcBuilders.standaloneSetup(bookController).setControllerAdvice(new GlobalExceptionHandler()) .build(); // Act & Assert mockMvc.perform(multipart("/addBook") .file(image) .param("name", "Test Book")) .andExpect(status().isInternalServerError()) .andExpect(result -> result.getResponse().equals("Failed to upload the file.")); } @Test void shouldFailWithMissingNameParameter() throws Exception { // Arrange MockMultipartFile image = new MockMultipartFile("imgUrl", "test.jpg", MediaType.IMAGE_JPEG_VALUE, "test content".getBytes()); mockMvc = MockMvcBuilders.standaloneSetup(bookController).build(); // Act & Assert mockMvc.perform(multipart("/addBook") .file(image)) .andExpect(status().isBadRequest()); } @Test void shouldFailWithMissingImageParameter() throws Exception { // Arrange mockMvc = MockMvcBuilders.standaloneSetup(bookController).build(); // Act & Assert mockMvc.perform(multipart("/addBook") .param("name", "Test Book")) .andExpect(status().isBadRequest()); } } }
अपने ऐप का परीक्षण शुरू करने के लिए ये कुछ सरल परीक्षण मामले हैं। याद रखें, पुनरावृत्ति से बचने के लिए हम कुछ फ़ैक्टरियों को जोड़कर इन परीक्षणों को दोबारा कर सकते हैं।
पढ़ने के लिए आपका शुक्रिया।
JUnit5 - दस्तावेज़
मॉकिटो - दस्तावेज़
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3