在 Spring Boot 3.x 中为控制器编写集成测试,主要是通过 @SpringBootTest 注解加载完整的应用上下文,并利用 MockMvc 或 TestRestTemplate 来模拟 HTTP 请求并验证响应。下面我将为你提供一个清晰的指南和代码示例。
两种测试
在Spring Boot项目中,测试通常分为单元测试和集成测试。以下是区分这两种测试的一些指导原则:
单元测试
- 定义:单元测试主要用于测试代码中的单个“单元”,通常是一个方法或类。它们的目标是验证特定功能的正确性。
- 特征:
- 独立性:单元测试不依赖于外部系统(如数据库、网络等)。
- 快速执行:通常执行时间很短。
- 使用Mock:通常会使用Mock对象来替代依赖项,以便只测试目标单元。
- 示例:
- @SpringBootTest
- public class UserServiceTest {
-
- @Mock
- private UserRepository userRepository;
- @InjectMocks
- private UserService userService;
- @Test
- public void testGetUserById() {
- // Arrange
- User user = new User(1, "John Doe");
- when(userRepository.findById(1)).thenReturn(Optional.of(user));
-
- // Act
- User result = userService.getUserById(1);
-
- // Assert
- assertEquals("John Doe", result.getName());
- }
- }
复制代码 集成测试
- 定义:集成测试用于测试多个组件之间的交互,通常是测试整个应用程序或其部分的行为。
- 特征:
- 依赖性:集成测试通常会启动Spring上下文,并可能连接到数据库或其他外部服务。
- 较慢执行:由于涉及多个组件,执行时间通常较长。
- 真实环境:测试在接近真实环境的条件下运行。
- 示例:
- @SpringBootTest
- @AutoConfigureMockMvc
- public class UserControllerTest {
- @Autowired
- private MockMvc mockMvc;
- @Test
- public void testGetUser() throws Exception {
- mockMvc.perform(get("/users/1"))
- .andExpect(status().isOk())
- .andExpect(jsonPath("$.name").value("John Doe"));
- }
- }
复制代码 如何区分
- 测试目标:
- 单元测试:关注单个类或方法。
- 集成测试:关注多个组件的协作。
- 使用的工具:
- 单元测试:Mockito、JUnit等。
- 集成测试:Spring Test、MockMvc等。
- 项目结构:
- 可以在src/test/java目录中创建不同的包,例如unit和integration,分别存放单元测试和集成测试。
- 命名约定:
- 可以在文件名中添加前缀或后缀,例如UserServiceTest(单元测试)和UserControllerIntegrationTest(集成测试)。
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |