Spring Boot 测试最佳实践

🧪 1. 测试分层策略 (Testing Strategy / Pyramid)

核心思想:多写单元测试,少写E2E测试
Core idea: More unit tests, fewer E2E tests

复制代码
        E2E Tests(少 / Few)
     Integration Tests(中 / Medium)
Unit Tests(多 / Many)

✅ 2. 单元测试最佳实践 (Unit Testing Best Practices)

👉 使用:JUnit + Mockito

✔ 原则 / Principles

  • 只测试一个类 (Test one class only)

  • Mock 外部依赖 (Mock dependencies)

  • 不连接数据库/网络 (No DB / network)


✔ 示例 / Example

复制代码
@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    void shouldReturnUser_whenUserExists() {
        User user = new User(1L, "Neo");

        when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        User result = userService.getUserById(1L);

        assertEquals("Neo", result.getName());
    }
}

💡 关键点 / Key Points

  • 使用 @Mock 模拟依赖

  • 使用 @InjectMocks 注入被测类

  • Use @Mock to isolate dependencies

  • Use @InjectMocks for target class


🔗 3. 集成测试最佳实践 (Integration Testing)

👉 使用:@SpringBootTest


✔ 原则 / Principles

  • 测试模块之间真实交互 (Test real interactions)

  • 可以连接数据库 (DB allowed)

  • 使用测试数据库 (Use test DB, e.g. H2)


✔ 示例 / Example

复制代码
@SpringBootTest
@Transactional
class UserServiceIntegrationTest {

    @Autowired
    private UserService userService;

    @Test
    void shouldSaveUser() {
        User user = new User(null, "Neo");

        User saved = userService.save(user);

        assertNotNull(saved.getId());
    }
}

💡 建议 / Tips

  • 使用 H2 内存数据库 (Use H2 in-memory DB)

  • 使用 @Transactional 自动回滚

  • Rollback after each test


🌐 4. Controller / API 测试 (Web Layer Testing)

👉 使用:@WebMvcTest + MockMvc


✔ 示例 / Example

复制代码
@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService userService;

    @Test
    void shouldReturnUser() throws Exception {
        when(userService.getUserById(1L))
            .thenReturn(new User(1L, "Neo"));

        mockMvc.perform(get("/users/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("Neo"));
    }
}

💡 关键点 / Key Points

  • 只加载 Web 层 (Load only web layer)

  • 使用 @MockBean 替代真实 Service

  • Use MockMvc to simulate HTTP calls


🧩 5. 数据库测试 (Repository Testing)

👉 使用:@DataJpaTest


✔ 示例 / Example

复制代码
@DataJpaTest
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void shouldFindByName() {
        userRepository.save(new User(null, "Neo"));

        Optional<User> user = userRepository.findByName("Neo");

        assertTrue(user.isPresent());
    }
}

💡 特点 / Features

  • 只加载 JPA 相关组件

  • Faster than full Spring context

  • 默认使用内存数据库


🔁 6. 回归测试策略 (Regression Strategy)

✔ 建议 / Recommendations

  • 每次提交运行单元测试

    Run unit tests on every commit

  • CI/CD 运行全部测试

    Run all tests in pipeline

  • 关键路径加 E2E

    Add E2E for critical flows


🚀 7. 测试命名规范 (Naming Convention)

👉 推荐格式 / Recommended format:

复制代码
should + ExpectedResult + when + Condition

示例 / Example

  • shouldReturnUser_whenUserExists

  • shouldThrowException_whenUserNotFound


⚠️ 8. 常见错误 (Common Mistakes)

❌ 写太多集成测试 → 慢

Too many integration tests → slow

❌ 单元测试依赖数据库

Unit test depends on DB

❌ 不做Mock

No mocking → not isolated

❌ 测试没有断言

No assertions


🧠 9. 最佳实践总结 (Final Summary)

类型 工具 用途
单元测试 JUnit + Mockito 快速、隔离
集成测试 @SpringBootTest 模块协作
Web测试 @WebMvcTest API层
数据库测试 @DataJpaTest JPA

💡 一句话总结 (One-line takeaway)

👉 80% 单元测试 + 15% 集成测试 + 5% E2E

👉 Focus on unit tests, use integration wisely

相关推荐
IT 行者2 小时前
LangChain4j 集成 Redis 向量存储:我踩过的坑和选型建议
java·人工智能·redis·后端
派星2 小时前
如何分享自己写的 Go 包
后端
snakeshe10102 小时前
从零理解 Spring 核心:IoC 容器与依赖注入,以及手写一个迷你版
后端
148612 小时前
Redis 删除缓存失败怎么办?重试、死信、补偿的工程化方案
后端
None3212 小时前
NestJS 流式文件上传实践:从 Multer 到 Busboy 的进阶之路
前端·后端
148612 小时前
MySQL 复合索引怎么设计?从业务 SQL 反推索引顺序
后端
DROm RAPS3 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
TlYf NTLE3 小时前
Spring Boot spring-boot-maven-plugin 参数配置详解
spring boot·后端·maven
花千树-0103 小时前
5分钟用 Java 构建你的第一个 AI 应用
java·人工智能·spring boot·langchain·aigc·ai编程