@WebMvcTest helps test only the web layer of your application, like controllers, without starting the full app. It makes tests faster and focused.
@WebMvcTest for controller testing in JUnit
@WebMvcTest(ControllerClass.class) public class ControllerTest { @Autowired private MockMvc mockMvc; @MockBean private SomeService someService; @Test public void testControllerMethod() throws Exception { mockMvc.perform(get("/endpoint")) .andExpect(status().isOk()) .andExpect(content().string("expected response")); } }
@WebMvcTest loads only the controller and related MVC components, not the full Spring context.
Use @MockBean to provide mock implementations for service dependencies.
@WebMvcTest(HelloController.class) public class HelloControllerTest { @Autowired private MockMvc mockMvc; @Test public void shouldReturnHello() throws Exception { mockMvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello World")); } }
@WebMvcTest(UserController.class) public class UserControllerTest { @Autowired private MockMvc mockMvc; @MockBean private UserService userService; @Test public void shouldReturnUserName() throws Exception { when(userService.getUserName()).thenReturn("Alice"); mockMvc.perform(get("/username")) .andExpect(status().isOk()) .andExpect(content().string("Alice")); } }
This test checks the /greet endpoint of GreetingController. The GreetingService is mocked to return "Hello Test". The test verifies the HTTP status is 200 OK and the response body matches the mocked string.
package com.example.demo; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.mockito.Mockito.when; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(GreetingController.class) public class GreetingControllerTest { @Autowired private MockMvc mockMvc; @MockBean private GreetingService greetingService; @Test public void testGreeting() throws Exception { when(greetingService.greet()).thenReturn("Hello Test"); mockMvc.perform(get("/greet")) .andExpect(status().isOk()) .andExpect(content().string("Hello Test")); } } // Controller class package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { private final GreetingService greetingService; public GreetingController(GreetingService greetingService) { this.greetingService = greetingService; } @GetMapping("/greet") public String greet() { return greetingService.greet(); } } // Service interface package com.example.demo; public interface GreetingService { String greet(); }
Always mock service dependencies to keep controller tests isolated.
Use MockMvc to simulate HTTP requests and check responses without starting a server.
@WebMvcTest does not load security or database layers unless explicitly configured.
@WebMvcTest focuses on testing Spring MVC controllers only.
MockMvc helps simulate HTTP calls and verify responses.
Mock dependencies with @MockBean to isolate controller logic.