MockMvc Deep Dive
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 = 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
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