在微服务架构中,Spring Boot 是一种非常流行的框架,因其简洁和高效的特性被广泛使用。在开发过程中,进行单元测试是确保代码质量的重要环节。使用 MockMvc 测试 Spring Boot 应用程序的 RESTful API,是非常有效的方式。本文将介绍如何使用 MockMvc 来测试 GET 和 POST 接口,包括单个和多个请求参数的场景。
一、环境准备
首先,确保你的 Spring Boot 项目中已经添加了必要的依赖。在 pom.xml
中添加以下依赖(如果尚未添加的话):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
二、编写接口
假设我们有一个简单的控制器 UserController
,包含一个 GET 接口和一个 POST 接口。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping
public ResponseEntity<List<User>> getUsers(@RequestParam(value = "age", required = false) Integer age) {
// 模拟获取用户列表
List<User> users = new ArrayList<>();
// 添加一些用户,实际情况下,可以从数据库中获取
users.add(new User(1, "Alice", 25));
users.add(new User(2, "Bob", 30));
// 根据年龄过滤
if (age != null) {
users = users.stream().filter(user -> user.getAge() == age).collect(Collectors.toList());
}
return ResponseEntity.ok(users);
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// 模拟用户创建,实际情况下应插入数据库
return ResponseEntity.status(HttpStatus.CREATED).body(user);
}
}
这里我们有一个 GET /users
接口可以根据年龄筛选用户,一个 POST /users
接口可以创建新用户。
三、使用 MockMvc 测试接口
接下来,我们将使用 MockMvc 来测试上面的接口。我们可以在测试类中创建 MockMvc 实例,并编写测试方法。
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUsers() throws Exception {
// 测试无请求参数的情况
mockMvc.perform(get("/users"))
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(2))) // 预期返回2个用户
.andExpect(jsonPath("$[0].name", is("Alice"))); // 检查第一个用户的姓名
// 测试带请求参数的情况
mockMvc.perform(get("/users").param("age", "25"))
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(1))) // 预期返回1个用户
.andExpect(jsonPath("$[0].name", is("Alice"))); // 检查用户姓名
mockMvc.perform(get("/users").param("age", "30"))
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(1))) // 预期返回1个用户
.andExpect(jsonPath("$[0].name", is("Bob"))); // 检查用户姓名
}
@Test
public void testCreateUser() throws Exception {
User newUser = new User(3, "Charlie", 28);
ObjectMapper objectMapper = new ObjectMapper();
String userJson = objectMapper.writeValueAsString(newUser);
// 测试用户创建接口
mockMvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content(userJson))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name", is("Charlie")))
.andExpect(jsonPath("$.age", is(28))); // 检查返回的用户信息
}
}
四、总结
在本文中,我们展示了如何使用 MockMvc 测试 Spring Boot 中的 GET 和 POST 接口。通过 MockMvc,我们可以模拟 HTTP 请求,验证请求的响应状态和返回结果。这对于保证接口的正确性以及在重构时进行回归测试都是十分有用的。测试的覆盖面可以根据实际业务逻辑的复杂性进行扩展,比如对异常情况的处理,参数的边界值测试等。希望本篇文章能够帮助你更好地理解和使用 MockMvc。