Spring Boot中JUnit、Mockito与集成测试的适用场景及各层测试选型
Spring Boot测试工具选型与分层测试指南
一、JUnit、Mockito、集成测试的核心区别与适用时机
- JUnit:Java测试的基础框架,负责帮你写测试用例、执行测试、做断言,还能管理测试的前后置操作(比如测试前初始化数据、测试后清理)。所有Java测试不管是单元还是集成类型,都得靠它来组织,是必备基础,不是和Mockito/集成测试二选一的选项。
- Mockito:专门用来造“假对象”的工具。当你只想测某一段代码的逻辑,不想依赖真实的数据库、第三方服务或者其他层的组件时,就用它模拟这些依赖的行为。比如测试Service时,不想真的连数据库,就用Mockito造个假的Repository,让它返回你预设好的数据。
- 集成测试:测试多个模块/组件协同工作的场景。比如要验证Controller调用Service、Service调用数据库的完整链路是否通畅,就得启动Spring容器,加载必要的上下文,甚至连接测试数据库,实打实跑一遍完整流程。
二、各层测试的工具选择
1. Repository层
- 要验证SQL逻辑、ORM映射是否正确(比如查询结果和数据库数据是否匹配),就用集成测试:用
@DataJpaTest注解启动仅与Repository相关的Spring上下文,连接H2内存数据库,直接操作真实库来测试,别用Mockito——Mock的Repository测不出真实的数据库交互逻辑。 - 只有在测试上层Service时,才需要用Mockito模拟Repository来隔离依赖,无需单独给Repository写Mock测试。
2. Service层
- 优先做单元测试:用JUnit + Mockito。把Service依赖的Repository、其他Service都用Mockito模拟掉,只测Service自身的业务逻辑——比如输入某个参数是否能得到预期输出,分支逻辑有没有走对。这种测试不用启动Spring容器,运行速度极快。
- 如果Service依赖了Redis、消息队列这类外部组件,或者要测试多个Service之间的交互,可以做轻量集成测试,启动部分Spring上下文验证交互是否正常。
3. Controller层
- 单元测试用JUnit + Mockito + MockMvc:用
@WebMvcTest只加载Controller相关的上下文,用Mockito模拟Service的返回值,然后用MockMvc发送模拟HTTP请求,检查请求路径、参数绑定、响应状态和内容是否符合预期。不用启动完整容器,效率很高。 - 要是想测试从HTTP请求到数据库的完整链路,就做集成测试:用
@SpringBootTest启动完整Spring容器,用TestRestTemplate或WebTestClient发送真实HTTP请求,验证整个流程的结果。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

