在Spring Boot项目中,使用`MockMvc`可以方便地测试`GET`和`POST`接口。下面是如何使用`MockMvc`来测试带有单个和多个请求参数的`GET`和`POST`接口的示例。
1. 准备工作
首先,确保你的项目中包含必要的依赖。如果你使用的是Maven,可以在`pom.xml`中添加以下依赖:
```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ```
2. 配置MockMvc
在测试类中配置`MockMvc`,可以通过`@WebMvcTest`注解或创建完整的Spring上下文(使用`@SpringBootTest`)来初始化`MockMvc`。
```java @RunWith(SpringRunner.class) @WebMvcTest(YourController.class) // 替换为你的控制器类 public class YourControllerTest { @Autowired private MockMvc mockMvc; // 测试方法在这里 } ```
3. 测试GET接口
3.1 单个请求参数
假设我们有一个简单的`GET`接口,接收一个名为`name`的请求参数:
```java @RestController @RequestMapping("/api") public class YourController { @GetMapping("/greet") public ResponseEntity<String> greet(@RequestParam String name) { return ResponseEntity.ok("Hello, " + name); } } ```
测试这个接口的方法如下:
```java @Test public void testGreetWithSingleParam() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/greet") .param("name", "John")) .andExpect(status().isOk()) .andExpect(content().string("Hello, John")); } ```
3.2 多个请求参数
假设我们有一个`GET`接口,需要两个请求参数`firstName`和`lastName`:
```java @GetMapping("/welcome") public ResponseEntity<String> welcome(@RequestParam String firstName, @RequestParam String lastName) { return ResponseEntity.ok("Welcome, " + firstName + " " + lastName); } ```
测试多个请求参数的方法如下:
```java @Test public void testWelcomeWithMultipleParams() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/welcome") .param("firstName", "John") .param("lastName", "Doe")) .andExpect(status().isOk()) .andExpect(content().string("Welcome, John Doe")); } ```
4. 测试POST接口
4.1 单个请求参数
假设我们有一个简单的`POST`接口,接收一个名为`message`的请求体:
```java @PostMapping("/echo") public ResponseEntity<String> echo(@RequestBody String message) { return ResponseEntity.ok(message); } ```
测试这个接口的方法如下:
```java @Test public void testEchoWithSingleParam() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/api/echo") .content("Hello, World!") .contentType(MediaType.TEXT_PLAIN)) .andExpect(status().isOk()) .andExpect(content().string("Hello, World!")); } ```
4.2 多个请求参数
假设我们有一个`POST`接口,需要接收一个包含多个字段的JSON对象:
```java @PostMapping("/createUser") public ResponseEntity<User> createUser(@RequestBody User user) { // 假设有一个User类,并且返回创建的用户对象 return ResponseEntity.ok(user); } ```
假设`User`类如下:
```java public class User { private String firstName; private String lastName; // getters and setters } ```
测试这个接口的方法如下:
```java @Test public void testCreateUserWithMultipleParams() throws Exception { String userJson = "{\"firstName\":\"John\", \"lastName\":\"Doe\"}"; mockMvc.perform(MockMvcRequestBuilders.post("/api/createUser") .content(userJson) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.firstName").value("John")) .andExpect(jsonPath("$.lastName").value("Doe")); } ```
5. 完整示例
以下是完整的测试类示例,包括对`GET`和`POST`接口的测试:
```java @RunWith(SpringRunner.class) @WebMvcTest(YourController.class) public class YourControllerTest { @Autowired private MockMvc mockMvc; @Test public void testGreetWithSingleParam() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/greet") .param("name", "John")) .andExpect(status().isOk()) .andExpect(content().string("Hello, John")); } @Test public void testWelcomeWithMultipleParams() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/welcome") .param("firstName", "John") .param("lastName", "Doe")) .andExpect(status().isOk()) .andExpect(content().string("Welcome, John Doe")); } @Test public void testEchoWithSingleParam() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/api/echo") .content("Hello, World!") .contentType(MediaType.TEXT_PLAIN)) .andExpect(status().isOk()) .andExpect(content().string("Hello, World!")); } @Test public void testCreateUserWithMultipleParams() throws Exception { String userJson = "{\"firstName\":\"John\", \"lastName\":\"Doe\"}"; mockMvc.perform(MockMvcRequestBuilders.post("/api/createUser") .content(userJson) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.firstName").value("John")) .andExpect(jsonPath("$.lastName").value("Doe")); } } ```
通过这些示例,我们可以了解如何使用`MockMvc`来测试Spring Boot应用中的`GET`和`POST`接口,处理单个和多个请求参数的场景。