0


Spring Boot 进行 MockMvc 单元测试的实例

在Spring Boot应用程序中,使用MockMvc进行单元测试是一种有效的方式,可以验证控制器的行为和API的正确性。在这篇博客中,我们将介绍如何使用MockMvc对用户控制器(UserController)进行测试,该控制器涉及用户信息的增删改查操作。

UserController测试类

  1. package com.lfsun.mockmvc;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.lfsun.mockmvc.entity.User;
  4. import com.lfsun.mockmvc.service.UserService;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import org.junit.runner.RunWith;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
  10. import org.springframework.boot.test.context.SpringBootTest;
  11. import org.springframework.http.MediaType;
  12. import org.springframework.test.context.junit4.SpringRunner;
  13. import org.springframework.test.web.servlet.MockMvc;
  14. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  15. import java.util.Arrays;
  16. import java.util.List;
  17. import static org.mockito.Mockito.when;
  18. import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
  19. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
  20. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  21. @RunWith(SpringRunner.class)
  22. @SpringBootTest
  23. @AutoConfigureMockMvc
  24. public class UserControllerTest {
  25. @Autowired
  26. private MockMvc mockMvc;
  27. @Autowired
  28. private UserService userService;
  29. @Autowired
  30. private ObjectMapper objectMapper;
  31. @Before
  32. public void setUp() {
  33. // 在测试前初始化一些数据,或者使用Mockito进行一些mock设置
  34. }
  35. @Test
  36. public void getAllUsersTest() throws Exception {
  37. mockMvc.perform(MockMvcRequestBuilders.get("/user/getAllUsers"))
  38. .andExpect(status().isOk())
  39. .andExpect(jsonPath("$").isArray())
  40. .andExpect(jsonPath("$.length()").value(userService.getAllUsers().size()))
  41. .andDo(print());
  42. }
  43. @Test
  44. public void getUserByIdTest() throws Exception {
  45. Long userId = 1L;
  46. mockMvc.perform(MockMvcRequestBuilders.get("/user/getUserById/{userId}", userId))
  47. .andExpect(status().isOk())
  48. .andExpect(jsonPath("$.userId").value(userId))
  49. .andDo(print());
  50. }
  51. @Test
  52. public void addUserTest() throws Exception {
  53. User user = new User();
  54. user.setUsername("testUser");
  55. user.setEmail("test@lfsun.com");
  56. mockMvc.perform(MockMvcRequestBuilders.post("/user/addUser")
  57. .contentType(MediaType.APPLICATION_JSON)
  58. .content(objectMapper.writeValueAsString(user)))
  59. .andExpect(status().isOk())
  60. .andExpect(jsonPath("$.username").value("testUser"))
  61. .andExpect(jsonPath("$.email").value("test@lfsun.com"))
  62. .andDo(print());
  63. }
  64. @Test
  65. public void updateUserTest() throws Exception {
  66. Long userId = 1L;
  67. User updatedUser = new User();
  68. updatedUser.setUserId(userId);
  69. updatedUser.setUsername("updatedUser");
  70. updatedUser.setEmail("updated@lfsun.com");
  71. mockMvc.perform(MockMvcRequestBuilders.put("/user/updateUser")
  72. .contentType(MediaType.APPLICATION_JSON)
  73. .content(objectMapper.writeValueAsString(updatedUser)))
  74. .andExpect(status().isOk())
  75. .andExpect(jsonPath("$.userId").value(userId))
  76. .andExpect(jsonPath("$.username").value("updatedUser"))
  77. .andExpect(jsonPath("$.email").value("updated@lfsun.com"))
  78. .andDo(print());
  79. }
  80. @Test
  81. public void deleteUserTest() throws Exception {
  82. Long userId = 1L;
  83. mockMvc.perform(MockMvcRequestBuilders.delete("/user/deleteUser/{userId}", userId))
  84. .andExpect(status().isOk())
  85. .andDo(print());
  86. }
  87. }

解释和注意事项

  1. MockMvc的注入:@Autowired 注解用于将MockMvc实例注入测试类中。
  2. 数据初始化: 使用 @Before 注解的 setUp 方法,可以在测试前进行一些数据初始化或使用Mockito进行一些mock设置。
  3. 测试方法: 每个测试方法使用MockMvc执行相应的HTTP请求,并使用断言验证控制器的响应是否符合预期。
  4. 数据序列化:ObjectMapper 负责将对象序列化为JSON,以便在POST和PUT请求中传递。

以下附上完整代码

controller:

  1. package com.lfsun.mockmvc.controller;
  2. import com.lfsun.mockmvc.entity.User;
  3. import com.lfsun.mockmvc.service.UserService;
  4. import lombok.RequiredArgsConstructor;
  5. import org.springframework.web.bind.annotation.*;
  6. import java.util.List;
  7. /**
  8. * 用户 Controller
  9. *
  10. * @author CL
  11. */
  12. @RestController
  13. @RequestMapping(value = "/user")
  14. @RequiredArgsConstructor
  15. public class UserController {
  16. private final UserService userService;
  17. // 查询所有用户
  18. @GetMapping("/getAllUsers")
  19. public List<User> getAllUsers() {
  20. return userService.getAllUsers();
  21. }
  22. // 根据用户ID查询用户
  23. @GetMapping("/getUserById/{userId}")
  24. public User getUserById(@PathVariable Long userId) {
  25. return userService.getUserById(userId);
  26. }
  27. // 添加用户
  28. @PostMapping("/addUser")
  29. public User addUser(@RequestBody User user) {
  30. return userService.addUser(user);
  31. }
  32. // 更新用户信息
  33. @PutMapping("/updateUser")
  34. public User updateUser(@RequestBody User user) {
  35. return userService.updateUser(user);
  36. }
  37. // 根据用户ID删除用户
  38. @DeleteMapping("/deleteUser/{userId}")
  39. public void deleteUser(@PathVariable Long userId) {
  40. userService.deleteUser(userId);
  41. }
  42. }

service、serviceimpl

  1. package com.lfsun.mockmvc.service;
  2. import com.lfsun.mockmvc.entity.User;
  3. import java.util.List;
  4. /**
  5. * 用户 Service 接口
  6. */
  7. public interface UserService {
  8. // 查询所有用户
  9. List<User> getAllUsers();
  10. // 根据用户ID查询用户
  11. User getUserById(Long userId);
  12. // 添加用户
  13. User addUser(User user);
  14. // 更新用户信息
  15. User updateUser(User user);
  16. // 根据用户ID删除用户
  17. void deleteUser(Long userId);
  18. }
  1. package com.lfsun.mockmvc.service.impl;
  2. import com.lfsun.mockmvc.entity.User;
  3. import com.lfsun.mockmvc.mapper.UserMapper;
  4. import com.lfsun.mockmvc.service.UserService;
  5. import lombok.AllArgsConstructor;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import java.util.List;
  9. /**
  10. * 用户 Service 实现类
  11. */
  12. @Service
  13. @AllArgsConstructor // Lombok 自动生成构造函数
  14. public class UserServiceImpl implements UserService {
  15. private final UserMapper userMapper;
  16. @Override
  17. public List<User> getAllUsers() {
  18. return userMapper.getAllUsers();
  19. }
  20. @Override
  21. public User getUserById(Long userId) {
  22. return userMapper.getUserById(userId);
  23. }
  24. @Override
  25. public User addUser(User user) {
  26. userMapper.addUser(user);
  27. return user;
  28. }
  29. @Override
  30. public User updateUser(User user) {
  31. userMapper.updateUser(user);
  32. return user;
  33. }
  34. @Override
  35. public void deleteUser(Long userId) {
  36. userMapper.deleteUser(userId);
  37. }
  38. }

mapper

  1. package com.lfsun.mockmvc.mapper;
  2. import com.lfsun.mockmvc.entity.User;
  3. import org.apache.ibatis.annotations.*;
  4. import java.util.List;
  5. /**
  6. * 用户 Mapper 接口
  7. */
  8. @Mapper
  9. public interface UserMapper {
  10. List<User> getAllUsers();
  11. User getUserById(Long userId);
  12. void addUser(User user);
  13. void updateUser(User user);
  14. void deleteUser(Long userId);
  15. }

实体类:

  1. package com.lfsun.mockmvc.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9. private Long userId;
  10. private String username;
  11. private String email;
  12. }

xml

  1. <!DOCTYPE mapper
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.lfsun.mockmvc.mapper.UserMapper">
  5. <resultMap id="BaseResultMap" type="com.lfsun.mockmvc.entity.User">
  6. <id column="user_id" property="userId" jdbcType="BIGINT"/>
  7. <result column="username" property="username" jdbcType="VARCHAR"/>
  8. <result column="email" property="email" jdbcType="VARCHAR"/>
  9. </resultMap>
  10. <!-- 查询所有用户 -->
  11. <select id="getAllUsers" resultMap="BaseResultMap">
  12. SELECT *
  13. FROM user;
  14. </select>
  15. <!-- 根据用户ID查询用户 -->
  16. <select id="getUserById" resultMap="BaseResultMap" parameterType="java.lang.Long">
  17. SELECT *
  18. FROM user
  19. WHERE user_id = #{userId};
  20. </select>
  21. <!-- 添加用户 -->
  22. <insert id="addUser" parameterType="com.lfsun.mockmvc.entity.User">
  23. INSERT INTO user (username, email)
  24. VALUES (#{username}, #{email});
  25. </insert>
  26. <!-- 更新用户信息 -->
  27. <update id="updateUser" parameterType="com.lfsun.mockmvc.entity.User">
  28. UPDATE user
  29. SET username = #{username},
  30. email = #{email}
  31. WHERE user_id = #{userId};
  32. </update>
  33. <!-- 根据用户ID删除用户 -->
  34. <delete id="deleteUser" parameterType="java.lang.Long">
  35. DELETE
  36. FROM user
  37. WHERE user_id = #{userId};
  38. </delete>
  39. </mapper>

配置

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.cj.jdbc.Driver
  4. url: jdbc:mysql://127.0.0.1:3306/mockmvc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
  5. username: root
  6. password: 123321
  7. mybatis:
  8. mapper-locations: classpath:/mapper/*.xml # 指定 MyBatis mapper 文件的位置
  9. configuration:
  10. map-underscore-to-camel-case: true # 配置驼峰命名规则

maven

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.14</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.lfsun</groupId>
  12. <artifactId>lfsun-study-mockmvc</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>lfsun-study-mockmvc</name>
  15. <description>lfsun-study-mockmvc</description>
  16. <properties>
  17. <java.version>17</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.projectlombok</groupId>
  35. <artifactId>lombok</artifactId>
  36. <scope>provided</scope>
  37. </dependency>
  38. <dependency>
  39. <groupId>junit</groupId>
  40. <artifactId>junit</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>mysql</groupId>
  45. <artifactId>mysql-connector-java</artifactId>
  46. <version>8.0.23</version>
  47. <scope>compile</scope>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.mybatis.spring.boot</groupId>
  51. <artifactId>mybatis-spring-boot-starter</artifactId>
  52. <version>1.3.2</version>
  53. </dependency>
  54. </dependencies>
  55. <build>
  56. <plugins>
  57. <plugin>
  58. <groupId>org.springframework.boot</groupId>
  59. <artifactId>spring-boot-maven-plugin</artifactId>
  60. </plugin>
  61. </plugins>
  62. </build>
  63. </project>

本文转载自: https://blog.csdn.net/qq_43116031/article/details/135581114
版权归原作者 冷风扇666 所有, 如有侵权,请联系我们删除。

“Spring Boot 进行 MockMvc 单元测试的实例”的评论:

还没有评论