🌐
Testing

Testing Controllers with MockMvc

@WebMvcTest
💡 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 — SAB kuch REALISTIC lagता hai, lekin FASTER, SAFER, aur CHEAPER.

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 ek FLIGHT SIMULATOR hai — REAL plane (actual HTTP server) UDAaye bina, PILOT (controller) ko EXACT SAME conditions (requests) mein TEST kiya ja sakta hai — SAB kuch REALISTIC lagता hai, lekin FASTER, SAFER, aur CHEAPER.
1 / 2
⚡ Quick Recap
  • 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
On this page (2 subtopics)

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.

💡Tip: @WebMvcTest FOCUSED, FAST tests ke liye hai — sirf controller logic (request mapping, validation, JSON serialization) test karna ho, business logic NAHI.