What if you could test your web pages without opening a browser or clicking buttons manually?
Why @WebMvcTest for controller testing in JUnit? - Purpose & Use Cases
Imagine you have a web app with many pages and buttons. You want to check if clicking a button shows the right page. Doing this by opening the browser and clicking every button manually takes hours.
Manual testing is slow and tiring. You might miss some buttons or forget steps. It's easy to make mistakes or skip tests. Also, you can't quickly check if a small change broke something else.
@WebMvcTest lets you test your web controllers automatically without starting the whole app. It focuses only on the web layer, so tests run fast and catch errors early.
Start app, open browser, click buttons, check pages manually.
@WebMvcTest public class MyControllerTest { @Autowired private MockMvc mockMvc; @Test void testPage() throws Exception { mockMvc.perform(get("/page")) .andExpect(status().isOk()) .andExpect(view().name("pageView")); } }
You can quickly and reliably check your web controllers work as expected without the hassle of full app startup or manual clicks.
A developer changes a button's URL. With @WebMvcTest, they run tests that catch the broken link immediately before release.
Manual web testing is slow and error-prone.
@WebMvcTest tests controllers fast and focused.
It helps catch web layer bugs early and reliably.
Practice
@WebMvcTest in Spring Boot testing?Solution
Step 1: Understand the role of @WebMvcTest
@WebMvcTest is designed to load only the Spring MVC components, mainly controllers, for focused testing.Step 2: Compare with other test types
Unlike full integration tests, it does not load services or repositories, making tests faster and isolated.Final Answer:
To test only the Spring MVC controllers without starting the full application context -> Option AQuick Check:
@WebMvcTest = Controller-only test [OK]
- Thinking @WebMvcTest loads full application context
- Confusing @WebMvcTest with @SpringBootTest
- Assuming it mocks external APIs automatically
@WebMvcTest annotated test class?Solution
Step 1: Identify mocking annotation for Spring beans
@MockBean is used to add mock implementations of Spring beans into the application context during tests.Step 2: Differentiate from other annotations
@MockMvc is not an annotation, @Autowired injects real beans, and @InjectMocks is from Mockito but not for Spring context injection.Final Answer:
@MockBean -> Option DQuick Check:
Mock dependencies in @WebMvcTest = @MockBean [OK]
- Using @Autowired instead of @MockBean for mocks
- Confusing @MockBean with Mockito's @InjectMocks
- Thinking @MockMvc is an annotation
@WebMvcTest and MockMvc:
@WebMvcTest(MyController.class)
class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testHello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello World"));
}
}
What will happen if the controller method mapped to /hello returns "Hello World" as response?Solution
Step 1: Analyze the test expectations
The test expects HTTP status 200 OK and response body "Hello World".Step 2: Match with controller behavior
If the controller returns "Hello World" with status 200, both expectations are met, so the test passes.Final Answer:
The test will pass because the response matches the expected string -> Option BQuick Check:
Matching response and status = test pass [OK]
- Assuming test fails if no explicit status set in controller
- Confusing autowiring issues with test failures
- Ignoring response content in assertions
@WebMvcTest(MyController.class)
class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private MyService myService;
@Test
void testEndpoint() throws Exception {
when(myService.getData()).thenReturn("data");
mockMvc.perform(get("/data"))
.andExpect(status().isOk())
.andExpect(content().string("data"));
}
}
If the test fails with a 404 Not Found error, what is the most likely cause?Solution
Step 1: Understand 404 error in MockMvc test
A 404 means the requested URL is not found in the controller mappings.Step 2: Check test setup
@WebMvcTest loads only controllers; if /data mapping is missing or incorrect, 404 occurs despite mocks.Final Answer:
The controller method for /data is missing or not mapped correctly -> Option CQuick Check:
404 error = missing controller mapping [OK]
- Blaming mock service return value for 404
- Assuming @SpringBootTest is needed for controller tests
- Ignoring URL mapping correctness
@WebMvcTest, how should you mock the service and verify the controller returns JSON with the user list correctly?Solution
Step 1: Mock the service dependency with @MockBean
In @WebMvcTest, use @MockBean to replace the service bean with a mock and stub its method to return the user list.Step 2: Use MockMvc to perform HTTP GET and verify JSON response
Perform a GET request on the controller endpoint and assert the JSON response matches the expected user list.Final Answer:
Use @MockBean to mock the service, stub the method to return a list, then use MockMvc to perform GET and expect JSON content -> Option AQuick Check:
Mock service + MockMvc GET + JSON assert = correct test [OK]
- Injecting real service instead of mocking
- Using full context test instead of @WebMvcTest
- Calling controller methods directly without MockMvc
Ready to prove it?
Pass the test and this pattern moves unknown
