"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > यूनिट JUnitnd मॉकिटो के साथ इमेज अपलोडर एपीआई का परीक्षण कर रही है

यूनिट JUnitnd मॉकिटो के साथ इमेज अपलोडर एपीआई का परीक्षण कर रही है

2024-08-19 को प्रकाशित
ब्राउज़ करें:849

Unit Testing the Image Uploader API with JUnitnd Mockito

इस श्रृंखला के पहले लेख में, हमने स्प्रिंग बूट, क्लाउडिनरी, डॉकर और पोस्टग्रेएसक्यूएल का उपयोग करके एक मजबूत छवि अपलोडर का निर्माण किया। हमने प्रोजेक्ट की स्थापना से लेकर छवि और जानकारी को सहेजने वाले अंतिम बिंदु तक अनुरोध करने तक सब कुछ कवर किया। यदि आपने अभी तक वह लेख नहीं पढ़ा है, तो मैं अत्यधिक अनुशंसा करता हूं कि जिस एप्लिकेशन के साथ हम काम करेंगे उसका ठोस आधार प्राप्त करने के लिए वहां से शुरुआत करें।

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

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

आइए यूनिट परीक्षण की दुनिया में उतरें और अपनी छवि अपलोडर एपीआई को बुलेटप्रूफ बनाएं!

की स्थापना

मैं जावा के लिए एक्सटेंशन पैक के साथ VSCode का उपयोग कर रहा हूं। अब हम अपने परीक्षण लिखने के लिए तैयार हैं।

यदि आप किसी अन्य आईडीई का उपयोग कर रहे हैं, तो यहां JUnit5 दस्तावेज़ में उन सभी के लिए समर्थन देखें।

परीक्षण

1. बुक सर्विस टेस्ट

बुकसर्विस क्लास पर राइट-क्लिक करें, टेस्ट पर जाएं पर क्लिक करें, और मेनू से उन तरीकों का चयन करें जिनके लिए आप टेस्ट जेनरेट करना चाहते हैं।

नीचे दी गई फ़ाइल की तरह एक समान फ़ाइल तैयार की जाएगी:

import org.junit.jupiter.api.Test;

public class BookServiceTest {
    @Test
    void testAddBook() {

    }
}

याद रखें, इस लेख के लिए, हम परीक्षण के AAA पैटर्न (अरेंज - एक्ट - एसर्ट) का उपयोग करने जा रहे हैं।

1.1. गुणों का उपहास करना

@ExtendWith(MockitoExtension.class)
public class BookServiceTest {

    @Mock
    private BookRepository bookRepository;

    @Mock
    private Cloudinary cloudinary;

    @Mock
    private MultipartFile multipartFile;

    @Mock
    private Uploader uploader;

    @Captor
    private ArgumentCaptor bookArgumentCaptor;

    @InjectMocks
    private BookService bookService;

}
  • @Mock एनोटेशन उन गुणों या निर्भरताओं के व्यवहार का अनुकरण/अनुकरण करते हैं जो वर्ग द्वारा उपयोग किए जाने वाले हैं।
  • @InjectMocks एनोटेशन मॉक बनाता है और संबंधित फ़ील्ड में इंजेक्ट करता है।

1.2. लेखन परीक्षण

  • एक सफल मामले का परीक्षण (चाहिएCreateANewBook).
  • रिपोजिटरी के लिए कॉल का परीक्षण (कॉलरिपोजिटरीसेव करना चाहिए)।
  • अपलोड विफल होने पर परीक्षण किया जा रहा है (ShouldFairTheUpload)।
@ExtendWith(MockitoExtension.class)
public class BookServiceTest {

    @Mock
    private BookRepository bookRepository;

    @Mock
    private Cloudinary cloudinary;

    @Mock
    private MultipartFile multipartFile;

    @Mock
    private Uploader uploader;

    @Captor
    private ArgumentCaptor bookArgumentCaptor;

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

2. पुस्तक नियंत्रक परीक्षण

  • सफलता के मामले का परीक्षण (चाहिएसफलता लौटाएं)
  • एक असफल मामले का परीक्षण (चाहिएFairToUploadImage)
  • अनुपलब्ध नाम पैरामीटर के साथ परीक्षण (shouldFAILWithMissingNameParameter)
  • अनुपलब्ध imgUrl पैरामीटर के साथ परीक्षण (shouldFAILWithMissingImageParameter)
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 - दस्तावेज़
मॉकिटो - दस्तावेज़

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/mspilari/unit-testing-the-image-uploader-api-with-junit5-and-mockito-ge1?1 यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग@163 से संपर्क करें इसे हटाने के लिए .com
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3