MockMvc helps you test your web controllers without starting a real server. It lets you check HTTP requests and responses quickly and easily.
MockMvc for HTTP assertions in Spring Boot
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andExpect(content().json(expectedJson))
.andReturn();mockMvc.perform() sends a fake HTTP request to your controller.
andExpect() checks the response status, content, or headers.
mockMvc.perform(get("/api/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello World"));
mockMvc.perform(post("/api/users") .contentType(MediaType.APPLICATION_JSON) .content("{\"name\":\"Alice\"}")) .andExpect(status().isCreated());
mockMvc.perform(get("/api/items/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(1)) .andExpect(jsonPath("$.name").value("Item One"));
This test sends a GET request to '/hello' and checks that the response is 200 OK with the text 'Hello World'.
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.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(HelloController.class) public class HelloControllerTest { @Autowired private MockMvc mockMvc; @Test public void testHelloEndpoint() throws Exception { mockMvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string("Hello World")); } } // Controller for reference: // @RestController // public class HelloController { // @GetMapping("/hello") // public String hello() { // return "Hello World"; // } // }
MockMvc tests only the web layer, so other parts like database are not started unless mocked.
Use @WebMvcTest to load only controller-related beans for faster tests.
You can chain multiple andExpect() calls to check different parts of the response.
MockMvc lets you test Spring Boot controllers without a real server.
It simulates HTTP requests and checks responses easily.
Use it to verify status codes, response bodies, and headers in your tests.
Practice
MockMvc in Spring Boot tests?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 AQuick Check:
MockMvc = HTTP testing without server [OK]
- Thinking MockMvc starts a real server
- Confusing MockMvc with deployment tools
- Assuming MockMvc manages databases
Solution
Step 1: Recall MockMvc syntax
The correct syntax usesmockMvc.perform(get("/url"))with static import ofget.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 AQuick Check:
Use perform(get()) for GET requests [OK]
- Using mockMvc.get() directly
- Confusing method names like request() or callGet()
- Not importing static get() method
mockMvc.perform(get("/hello"))
.andExpect(status().isOk());Solution
Step 1: Understand status().isOk()
The methodstatus().isOk()checks for HTTP status code 200.Step 2: Match status codes
200 means success, 404 means not found, 500 means server error, 302 means redirect.Final Answer:
200 OK -> Option CQuick Check:
status().isOk() = 200 OK [OK]
- Confusing isOk() with error codes
- Assuming isOk() means redirect
- Mixing status codes meanings
mockMvc.perform(post("/submit"))
.andExpect(status().isOk)
.andExpect(content().string("Success"));Solution
Step 1: Check method calls
The methodisOkmust 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 BQuick Check:
Method calls need parentheses like isOk() [OK]
- Forgetting parentheses on isOk()
- Confusing post and get methods
- Using wrong content matcher method
/user/1 endpoint that returns {"name":"Alice","age":30}. Which MockMvc assertion correctly checks the name field in the JSON response?Solution
Step 1: Understand JSON path syntax
To check JSON fields, usejsonPath("$.fieldName")withvalue()for expected value.Step 2: Evaluate options
andExpect(jsonPath("$.name").value("Alice")) uses correct syntax. andExpect(content().json("name: Alice")) has invalid JSON format. andExpect(jsonPath("name").isEqualTo("Alice")) uses wrong jsonPath syntax. andExpect(content().string("Alice")) checks whole string, not JSON field.Final Answer:
andExpect(jsonPath("$.name").value("Alice")) -> Option DQuick Check:
Use jsonPath("$.field").value() for JSON checks [OK]
- Wrong jsonPath syntax without $
- Trying to match JSON with plain string
- Using incorrect matcher methods
Ready to prove it?
Pass the test and this pattern moves unknown
