Testing Controllers with MockMvc
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(UserController.class) sirf WEB LAYER load karta hai — controller aur uski web-related config, LEKIN Service/Repository layer beans LOAD NAHI hote. Unhe @MockBean se explicitly MOCK karna padta hai. Isse tests @SpringBootTest se BAHUT FASTER hote hain — poora application context load nahi hota.
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void shouldReturnUserById() throws Exception {
when(userService.findById(1L)).thenReturn(new User(1L, "Aarav"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Aarav"));
}
@Test
void shouldReturn404WhenNotFound() throws Exception {
when(userService.findById(99L)).thenThrow(new UserNotFoundException());
mockMvc.perform(get("/api/users/99"))
.andExpect(status().isNotFound());
}
}- MockMvc = controller testing bina REAL HTTP server ke
- @WebMvcTest = sirf web layer load, service/repository @MockBean se mock
- @SpringBootTest se BAHUT FASTER — poora context load nahi hota
MockMvc Spring MVC controllers ko TEST karne ka tareeka hai, BINA actual HTTP server START kiye — requests SIMULATE hoti hain, controller logic execute hota hai, response ASSERT kiya jaata hai. Bahut FAST hai (real server startup ka overhead NAHI).
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void shouldReturnUser() throws Exception {
when(userService.findById(1L)).thenReturn(new User(1L, "Riya"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Riya"));
}
}@WebMvcTest sirf WEB LAYER (controllers, filters) LOAD karta hai — Service/Repository layer LOAD NAHI hote (unhe @MockBean se MOCK karna padta hai). Ye @SpringBootTest se BAHUT FASTER hai, kyunki POORA application context load NAHI hota.