Bird
Raised Fist0
Spring Bootframework~5 mins

@WebMvcTest for controller testing in Spring Boot - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the @WebMvcTest annotation in Spring Boot?

@WebMvcTest is used to test Spring MVC controllers. It loads only the web layer, not the full application context, making tests faster and focused on controller behavior.

Click to reveal answer
intermediate
Which Spring components are loaded when using @WebMvcTest?

Only the web layer components like controllers, @ControllerAdvice, Filter, and WebMvcConfigurer are loaded. Services, repositories, and other beans are not loaded unless explicitly mocked.

Click to reveal answer
intermediate
How do you mock a service dependency in a @WebMvcTest controller test?

You use @MockBean to create a mock of the service and inject it into the controller during the test.

Click to reveal answer
beginner
What is the role of MockMvc in @WebMvcTest?

MockMvc allows you to perform HTTP requests to the controller and verify responses without starting a real server.

Click to reveal answer
beginner
Why is @WebMvcTest preferred over @SpringBootTest for controller tests?

@WebMvcTest loads only the web layer, making tests faster and more focused. @SpringBootTest loads the full application context, which is slower and less focused for controller testing.

Click to reveal answer
What does @WebMvcTest load for testing?
AOnly the web layer (controllers and related components)
BThe full application context
COnly service and repository beans
DOnly database connections
Which annotation is used to mock a service in a @WebMvcTest?
A@Autowired
B@Component
C@Service
D@MockBean
What is the main tool to perform HTTP requests in @WebMvcTest?
AMockMvc
BWebClient
CRestTemplate
DHttpClient
Why might you prefer @WebMvcTest over @SpringBootTest for controller tests?
AIt loads the full application context
BIt is slower but more thorough
CIt loads only the web layer, making tests faster
DIt automatically tests the database
If your controller depends on a service, what must you do in a @WebMvcTest?
ANothing, the service is loaded automatically
BMock the service with <code>@MockBean</code>
CUse <code>@Autowired</code> on the service
DUse <code>@Service</code> on the test class
Explain how @WebMvcTest helps in testing Spring Boot controllers and what you need to do to handle service dependencies.
Think about what parts of the app are loaded and how to provide missing parts.
You got /4 concepts.
    Describe the difference between @WebMvcTest and @SpringBootTest when testing controllers.
    Consider scope and speed of tests.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using @WebMvcTest in Spring Boot testing?
      easy
      A. To test only the web layer (controllers) without starting the full application context
      B. To test the entire Spring Boot application including database and services
      C. To perform integration testing with real HTTP calls
      D. To test only the service layer without controllers

      Solution

      1. Step 1: Understand the role of @WebMvcTest

        @WebMvcTest is designed to load only the Spring MVC components like controllers, filters, and related configurations, not the full app context.
      2. Step 2: Compare with other test annotations

        Unlike @SpringBootTest which loads the full context, @WebMvcTest focuses on controller layer for fast, isolated web tests.
      3. Final Answer:

        To test only the web layer (controllers) without starting the full application context -> Option A
      4. Quick Check:

        @WebMvcTest = controller-only test [OK]
      Hint: Remember @WebMvcTest loads only controllers, not full app [OK]
      Common Mistakes:
      • Thinking @WebMvcTest loads full Spring context
      • Confusing @WebMvcTest with @SpringBootTest
      • Assuming it tests service or repository layers
      2. Which of the following is the correct way to declare a test class using @WebMvcTest for a controller named UserController?
      easy
      A. @WebMvcTest(UserController.class) public class UserControllerTest {}
      B. @WebMvcTest public class UserControllerTest {}
      C. @WebMvcTest(services = UserController.class) public class UserControllerTest {}
      D. @WebMvcTest(controllers = UserController.class) public class UserControllerTest {}

      Solution

      1. Step 1: Check @WebMvcTest syntax for specifying controllers

        The correct syntax to specify which controllers to test is using the 'controllers' attribute, e.g., @WebMvcTest(controllers = UserController.class).
      2. Step 2: Eliminate incorrect options

        @WebMvcTest(UserController.class) public class UserControllerTest {} misses 'controllers =' keyword, @WebMvcTest public class UserControllerTest {} does not specify controller, @WebMvcTest(services = UserController.class) public class UserControllerTest {} wrongly uses 'services' attribute.
      3. Final Answer:

        @WebMvcTest(controllers = UserController.class) public class UserControllerTest {} -> Option D
      4. Quick Check:

        @WebMvcTest(controllers = ...) is correct syntax [OK]
      Hint: Use 'controllers =' to specify controller class in @WebMvcTest [OK]
      Common Mistakes:
      • Omitting 'controllers =' keyword
      • Using 'services =' instead of 'controllers ='
      • Not specifying any controller class
      3. Given the following test code snippet using @WebMvcTest and MockMvc, what will be the HTTP status returned by the test?
      @WebMvcTest(controllers = HelloController.class)
      public class HelloControllerTest {
      
        @Autowired
        private MockMvc mockMvc;
      
        @Test
        public void testHello() throws Exception {
          mockMvc.perform(get("/hello"))
                 .andExpect(status().isOk());
        }
      }
      
      @RestController
      class HelloController {
        @GetMapping("/hello")
        public String sayHello() {
          return "Hello World";
        }
      }
      medium
      A. 404 Not Found
      B. 200 OK
      C. 500 Internal Server Error
      D. 302 Found (Redirect)

      Solution

      1. Step 1: Analyze the controller mapping

        The HelloController has a GET mapping for '/hello' that returns a string "Hello World".
      2. Step 2: Understand MockMvc test behavior

        The test performs a GET request to '/hello' and expects status 200 OK, which matches the controller's response.
      3. Final Answer:

        200 OK -> Option B
      4. Quick Check:

        GET /hello returns 200 OK [OK]
      Hint: Check controller mappings match test request URL [OK]
      Common Mistakes:
      • Expecting 404 when mapping exists
      • Confusing status codes for successful GET
      • Missing controller in @WebMvcTest causing 404
      4. Identify the error in the following @WebMvcTest test class that causes the test to fail with a NullPointerException.
      @WebMvcTest(controllers = UserController.class)
      public class UserControllerTest {
      
        private MockMvc mockMvc;
      
        @Test
        public void testGetUser() throws Exception {
          mockMvc.perform(get("/user/1"))
                 .andExpect(status().isOk());
        }
      }
      medium
      A. Missing @Autowired annotation on MockMvc field
      B. Wrong controller class specified in @WebMvcTest
      C. Missing @Test annotation on test method
      D. MockMvc cannot perform GET requests

      Solution

      1. Step 1: Check MockMvc initialization

        The MockMvc field is declared but not initialized or injected, so it remains null causing NullPointerException.
      2. Step 2: Fix by adding @Autowired

        Adding @Autowired on the MockMvc field lets Spring inject the mockMvc instance for testing.
      3. Final Answer:

        Missing @Autowired annotation on MockMvc field -> Option A
      4. Quick Check:

        MockMvc must be @Autowired to avoid null [OK]
      Hint: Always @Autowired MockMvc in @WebMvcTest classes [OK]
      Common Mistakes:
      • Forgetting @Autowired on MockMvc
      • Assuming MockMvc is auto-initialized without annotation
      • Misnaming test methods without @Test
      5. You want to test a controller OrderController that depends on a service OrderService. Using @WebMvcTest, how can you provide a mock OrderService to the controller during testing?
      hard
      A. Create a new OrderService instance manually in the test method
      B. Use @Autowired on OrderService field to inject real service
      C. Use @MockBean on OrderService field in the test class to inject a mock
      D. Use @SpringBootTest instead of @WebMvcTest to load full context

      Solution

      1. Step 1: Understand @WebMvcTest scope

        @WebMvcTest loads only web layer, so service beans are not loaded automatically.
      2. Step 2: Use @MockBean to provide mock dependencies

        Annotating OrderService with @MockBean in the test class creates and injects a mock into the controller.
      3. Final Answer:

        Use @MockBean on OrderService field in the test class to inject a mock -> Option C
      4. Quick Check:

        @MockBean mocks service dependencies in @WebMvcTest [OK]
      Hint: Use @MockBean to mock services in @WebMvcTest [OK]
      Common Mistakes:
      • Trying to @Autowired real service in @WebMvcTest
      • Not mocking service causing NoSuchBeanDefinitionException
      • Switching to @SpringBootTest unnecessarily
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard