使用`MockMvc`额外的补充和高级用法

简介: 使用`MockMvc`额外的补充和高级用法

使用`MockMvc`额外的补充和高级用法

 

1. 处理路径变量的GET请求

 

假设你的控制器有一个带路径变量的`GET`接口:

 

```java
@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
    // 假设通过ID获取用户信息
    User user = new User(id, "John", "Doe");
    return ResponseEntity.ok(user);
}
```

 

测试这个接口的方法如下:

 

```java
@Test
public void testGetUserById() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/api/users/{id}", 1L))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.id").value(1))
            .andExpect(jsonPath("$.firstName").value("John"))
            .andExpect(jsonPath("$.lastName").value("Doe"));
}
```

 

2. 处理带Header的请求

 

假设你的控制器需要处理带特定`Header`的请求:

 

```java
@PostMapping("/secured")
public ResponseEntity<String> securedEndpoint(@RequestHeader("Authorization") String authorizationHeader) {
    if ("Bearer valid_token".equals(authorizationHeader)) {
        return ResponseEntity.ok("Access granted");
    } else {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Access denied");
    }
}
```

 

测试这个接口的方法如下:

 

```java
@Test
public void testSecuredEndpointWithValidToken() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.post("/api/secured")
            .header("Authorization", "Bearer valid_token"))
            .andExpect(status().isOk())
            .andExpect(content().string("Access granted"));
}
 
@Test
public void testSecuredEndpointWithInvalidToken() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.post("/api/secured")
            .header("Authorization", "Bearer invalid_token"))
            .andExpect(status().isUnauthorized())
            .andExpect(content().string("Access denied"));
}
```

 

3. 处理文件上传的POST请求

 

假设你的控制器需要处理文件上传:

 

```java
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
    // 假设处理文件上传逻辑
    return ResponseEntity.ok("File uploaded successfully: " + file.getOriginalFilename());
}
```

 

测试文件上传的方法如下:

 

```java
@Test
public void testHandleFileUpload() throws Exception {
    MockMultipartFile file = new MockMultipartFile("file", "test.txt", "text/plain", "Spring Framework".getBytes());
 
    mockMvc.perform(MockMvcRequestBuilders.multipart("/api/upload").file(file))
            .andExpect(status().isOk())
            .andExpect(content().string("File uploaded successfully: test.txt"));
}
```

 

4. 验证请求体中的JSON字段

 

假设你有一个需要验证请求体中JSON字段的`POST`接口:

 

```java
@PostMapping("/createOrder")
public ResponseEntity<Order> createOrder(@RequestBody Order order) {
    // 假设有一个Order类,并且返回创建订单对象
    return ResponseEntity.ok(order);
}
```

 

假设`Order`类如下:

 

```java
public class Order {
    private Long id;
    private String product;
    private Integer quantity;
    // getters and setters
}
```

 

测试这个接口的方法如下:

 

```java
@Test
public void testCreateOrder() throws Exception {
    String orderJson = "{\"id\":1, \"product\":\"Laptop\", \"quantity\":2}";
 
    mockMvc.perform(MockMvcRequestBuilders.post("/api/createOrder")
            .content(orderJson)
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.id").value(1))
            .andExpect(jsonPath("$.product").value("Laptop"))
            .andExpect(jsonPath("$.quantity").value(2));
}
```

 

5. 测试异常处理

 

假设你的控制器有全局异常处理:

 

```java
@RestControllerAdvice
public class GlobalExceptionHandler {
 
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}
```

 

在控制器中抛出`ResourceNotFoundException`:

 

```java
@GetMapping("/resource/{id}")
public ResponseEntity<String> getResource(@PathVariable Long id) {
    throw new ResourceNotFoundException("Resource not found with id " + id);
}
```

 

测试异常处理的方法如下:

 

```java
@Test
public void testResourceNotFoundException() throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/api/resource/{id}", 1L))
            .andExpect(status().isNotFound())
            .andExpect(content().string("Resource not found with id 1"));
}
```

 

6. 完整的测试类示例

 

以下是包含所有上述测试的完整测试类示例:

 

```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"));
    }
 
    @Test
    public void testGetUserById() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/api/users/{id}", 1L))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id").value(1))
                .andExpect(jsonPath("$.firstName").value("John"))
                .andExpect(jsonPath("$.lastName").value("Doe"));
    }
 
    @Test
    public void testSecuredEndpointWithValidToken() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/secured")
                .header("Authorization", "Bearer valid_token"))
                .andExpect(status().isOk())
                .andExpect(content().string("Access granted"));
    }
 
    @Test
    public void testSecuredEndpointWithInvalidToken() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/secured")
                .header("Authorization", "Bearer invalid_token"))
                .andExpect(status().isUnauthorized())
                .andExpect(content().string("Access denied"));
    }
 
    @Test
    public void testHandleFileUpload() throws Exception {
        MockMultipartFile file = new MockMultipartFile("file", "test.txt", "text/plain", "Spring Framework".getBytes());
 
        mockMvc.perform(MockMvcRequestBuilders.multipart("/api/upload").file(file))
                .andExpect(status().isOk())
                .andExpect(content().string("File uploaded successfully: test.txt"));
    }
 
    @Test
    public void testCreateOrder() throws Exception {
        String orderJson = "{\"id\":1, \"product\":\"Laptop\", \"quantity\":2}";
 
        mockMvc.perform(MockMvcRequestBuilders.post("/api/createOrder")
                .content(orderJson)
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id").value(1))
                .andExpect(jsonPath("$.product").value("Laptop"))
                .andExpect(jsonPath("$.quantity").value(2));
    }
 
    @Test
    public void testResourceNotFoundException() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/api/resource/{id}", 1L))
                .andExpect(status().isNotFound())
                .andExpect(content().string("Resource not found with id 1"));
    }
}
```

 

通过这些示例,我们可以更好地理解如何使用`MockMvc`来测试Spring Boot应用中的各种情况,包括路径变量、请求头、文件上传、JSON请求体验证以及异常处理。

目录
相关文章
|
2月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
7月前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
57 0
|
6月前
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
69 5
|
数据安全/隐私保护
fastadmin中写接口是时Validate规则验证自定义如何用
fastadmin中写接口是时Validate规则验证自定义如何用
276 0
|
8月前
|
C++
C++:类的补充知识
C++:类的补充知识
45 0
|
8月前
|
Oracle Java 关系型数据库
Generator【SpringBoot集成】代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)
Generator【SpringBoot集成】代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)
157 0
|
存储 XML 消息中间件
filter功能演示-鉴权、声明缓存
filter功能演示-鉴权、声明缓存
172 0
【Nest教程】为项目增加个自定义过滤器
【Nest教程】为项目增加个自定义过滤器
223 0
【Nest教程】为项目增加个自定义过滤器
|
Java 编译器 数据库
Java注解—高级用法与深入解读(1)
Java注解—高级用法与深入解读(1)
406 0
Java注解—高级用法与深入解读(1)
|
Java 编译器 API
Java注解—高级用法与深入解读(2)
Java注解—高级用法与深入解读(2)
209 0
Java注解—高级用法与深入解读(2)