📖 Scenario: You are building a simple Spring Boot web application that has a REST endpoint to greet users by name.To ensure your endpoint works correctly, you want to write tests that simulate HTTP requests and check the responses without starting the full server.
🎯 Goal: Create a test class using MockMvc to send a GET request to the greeting endpoint and assert the HTTP status and response content.
📋 What You'll Learn
Create a Spring Boot REST controller with a GET endpoint /greet that accepts a name query parameter and returns a greeting message.
Set up a MockMvc instance in the test class.
Write a test method that performs a GET request to /greet?name=Alice using MockMvc.
Assert that the HTTP status is 200 (OK) and the response body contains the greeting message Hello, Alice!.
💡 Why This Matters
🌍 Real World
MockMvc is used in Spring Boot projects to test web controllers quickly and reliably without deploying the full application server.
💼 Career
Understanding MockMvc is essential for backend developers working with Spring Boot to write automated tests that ensure web endpoints behave as expected.
Progress0 / 4 steps
1
Create the GreetingController REST endpoint
Create a Spring Boot REST controller class called GreetingController with a GET mapping for /greet that accepts a name query parameter and returns the string "Hello, " + name + "!".
Spring Boot
Hint
Use @RestController and @GetMapping annotations. The method should take a @RequestParam String name and return the greeting string.
2
Set up MockMvc in the test class
Create a test class called GreetingControllerTest annotated with @WebMvcTest(GreetingController.class). Inject a MockMvc field using @Autowired.
Spring Boot
Hint
Use @WebMvcTest on the test class and @Autowired to inject MockMvc.
3
Write a test method to perform GET request and assert response
In GreetingControllerTest, write a test method called testGreetReturnsHelloMessage annotated with @Test. Use mockMvc.perform to send a GET request to /greet?name=Alice. Assert that the status is 200 and the response content is exactly Hello, Alice!.
Spring Boot
Hint
Use mockMvc.perform(get(...)) and chain andExpect calls for status and content.
4
Add @AutoConfigureMockMvc annotation to enable MockMvc auto-configuration
In the GreetingControllerTest class, add the annotation @AutoConfigureMockMvc above the class declaration to enable automatic MockMvc configuration.
Spring Boot
Hint
Add @AutoConfigureMockMvc above the test class to enable MockMvc auto-configuration.
Practice
(1/5)
1. What is the main purpose of using MockMvc in Spring Boot tests?
easy
A. To test HTTP requests and responses without starting a real server
B. To deploy the application to a production server
C. To generate HTML pages automatically
D. To manage database connections
Solution
Step 1: Understand MockMvc role
MockMvc simulates HTTP requests and responses in tests without needing a real server.
Step 2: Compare options
Options A, B, and D describe unrelated tasks like HTML generation, deployment, or database management.
Final Answer:
To test HTTP requests and responses without starting a real server -> Option A
Quick Check:
MockMvc = HTTP testing without server [OK]
Hint: MockMvc tests HTTP calls without running the server [OK]
Common Mistakes:
Thinking MockMvc starts a real server
Confusing MockMvc with deployment tools
Assuming MockMvc manages databases
2. Which of the following is the correct way to perform a GET request using MockMvc?
easy
A. mockMvc.perform(get("/api/data"))
B. mockMvc.get("/api/data")
C. mockMvc.request("GET", "/api/data")
D. mockMvc.callGet("/api/data")
Solution
Step 1: Recall MockMvc syntax
The correct syntax uses mockMvc.perform(get("/url")) with static import of get.
Step 2: Check other options
Options B, C, and D use invalid method names not provided by MockMvc API.
Final Answer:
mockMvc.perform(get("/api/data")) -> Option A
Quick Check:
Use perform(get()) for GET requests [OK]
Hint: Use perform(get("url")) to send GET requests [OK]
Common Mistakes:
Using mockMvc.get() directly
Confusing method names like request() or callGet()
Not importing static get() method
3. Given the following test snippet, what HTTP status code will be asserted?
The method isOk must be called with parentheses: isOk().
Step 2: Verify other parts
Using post for /submit is valid; content().string() is correct; so no other errors.
Final Answer:
Missing parentheses after isOk method call -> Option B
Quick Check:
Method calls need parentheses like isOk() [OK]
Hint: Always add () after status check methods like isOk() [OK]
Common Mistakes:
Forgetting parentheses on isOk()
Confusing post and get methods
Using wrong content matcher method
5. You want to test a JSON response from /user/1 endpoint that returns {"name":"Alice","age":30}. Which MockMvc assertion correctly checks the name field in the JSON response?
hard
A. andExpect(content().string("Alice"))
B. andExpect(content().json("name: Alice"))
C. andExpect(jsonPath("name").isEqualTo("Alice"))
D. andExpect(jsonPath("$.name").value("Alice"))
Solution
Step 1: Understand JSON path syntax
To check JSON fields, use jsonPath("$.fieldName") with value() for expected value.