🧪
Testing REST APIs

MockMvc Deep Dive

Controller Testing Bina Server Ke
💡 MockMvc, EK FLIGHT SIMULATOR hai — REAL PLANE (ACTUAL HTTP SERVER) UDAaye BINA, PILOT (CONTROLLER) ko, EXACT SAME CONDITIONS (REQUESTS) mein, TEST kiya ja sakta hai — REALISTIC, LEKIN, FASTER, SAFER.

MockMvc, Spring MVC controllers ko, TEST karta hai, BINA, ACTUAL, HTTP SERVER (Tomcat) START kiye — REQUESTS, SIMULATED HOTI hain (DispatcherServlet KE THROUGH), CONTROLLER LOGIC, NORMALLY, EXECUTE hota hai, RESPONSE ko, ASSERT kiya jaata hai (STATUS CODE, JSON BODY, HEADERS).

@WebMvcTest(ControllerClass.class), SIRF, WEB LAYER LOAD karta hai — SERVICE/REPOSITORY layer beans, @MockBean SE, MOCK karne PADТE hain. jsonPath() EXPRESSIONS SE, RESPONSE JSON ke, SPECIFIC FIELDS, ASSERT kiye ja sakte hain.

@WebMvcTest(ProductController.class)
class ProductControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private ProductService productService;

    @Test
    void shouldReturnProduct() throws Exception {
        when(productService.findById(1L)).thenReturn(new ProductDto(1L, "Laptop", 999));

        mockMvc.perform(get("/api/products/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("Laptop"))
            .andExpect(jsonPath("$.price").value(999));
    }

    @Test
    void shouldCreateProduct() throws Exception {
        mockMvc.perform(post("/api/products")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"name\":\"Mouse\",\"price\":25}"))
            .andExpect(status().isCreated());
    }
}
🧪
MockMvc, EK FLIGHT SIMULATOR hai — REAL PLANE (ACTUAL HTTP SERVER) UDAaye BINA, PILOT (CONTROLLER) ko, EXACT SAME CONDITIONS (REQUESTS) mein, TEST kiya ja sakta hai — REALISTIC, LEKIN, FASTER, SAFER.
1 / 6
⚡ Quick Recap
  • MockMvc = controller testing, BINA REAL HTTP server ke
  • @WebMvcTest = sirf web layer load, service/repo, @MockBean se mock
  • jsonPath() = response JSON ke, SPECIFIC fields, assert karne ke liye
On this page (2 subtopics)

spring-security-test dependency SE, @WithMockUser ANNOTATION, TEST METHODS PAR, LAGАके, EK, "FAKE", AUTHENTICATED, USER, SIMULATE kiya ja sakta hai — SECURITY-PROTECTED, ENDPOINTS ko, TEST karne ke liye, REAL, LOGIN FLOW, KARNE ki, ZAROORAT NAHI.

@Test
@WithMockUser(roles = "ADMIN")
void shouldDeleteProduct() throws Exception {
    mockMvc.perform(delete("/api/products/1")).andExpect(status().isNoContent());
}

jsonPath("$.length()").value(3), EK, JSON, ARRAY ki, LENGTH, CHECK karta hai. jsonPath("$[0].name").value("Laptop"), ARRAY ke, FIRST, ELEMENT ke, SPECIFIC, FIELD ko, ASSERT karta hai — COMPLEX, RESPONSE, STRUCTURES ko, PRECISELY, VERIFY kiya ja sakta hai.

  • $.length() = array ki, length, check karna
  • $[0].fieldName = specific array element ka, field, ASSERT karna