@ExtendWith(SpringExtension.class)与@SpringBootTest的测试差异
两段Spring测试代码的功能差异对比
基础背景先理清
@ExtendWith(SpringExtension.class)是JUnit 5和Spring测试框架的衔接工具,它只负责让JUnit 5能识别Spring的相关特性,但本身不会自动启动Spring上下文——得搭配@ContextConfiguration这类注解,才会加载指定的Spring容器。
@SpringBootTest是Spring Boot专门做集成测试的注解,它底层已经包含了@ExtendWith(SpringExtension.class)的能力,还会自动加载Spring Boot的完整应用上下文(默认找项目里的@SpringBootApplication类),同时附带一堆Spring Boot专属的测试特性。
第一段代码能实现但第二段做不到的
- 轻量化、自定义的上下文加载:可以搭配
@ContextConfiguration指定任意单个/多个配置类或XML文件,不用加载整个Spring Boot应用的所有Bean,测试启动更快,适合只测某几个组件的场景。 - 支持普通Spring项目测试:如果你的项目是传统Spring项目(不是Spring Boot),
@SpringBootTest完全用不了,但@ExtendWith(SpringExtension.class)能配合Spring的其他测试注解(比如@Transactional、@MockBean)完成标准Spring测试。 - 自由组合JUnit扩展:可以同时搭配多个自定义的JUnit 5 Extension,不受Spring Boot测试框架的绑定,自由度更高。
第二段代码能实现但第一段做不到的
- 自动加载完整Spring Boot上下文:不用手动指定配置类,自动识别项目主启动类,加载所有自动配置、Bean、外部配置,适合做全链路集成测试,验证整个应用的协同逻辑。
- 内置Web环境配置:通过
webEnvironment参数可以灵活配置Web环境,比如示例里的RANDOM_PORT会启动真实内嵌服务器并使用随机端口,还支持模拟Servlet环境、指定端口等,方便直接测试Controller、过滤器等Web组件。 - Spring Boot专属测试特性:能自动注入
TestRestTemplate或WebTestClient来调用接口,支持@TestConfiguration自定义测试专属配置,替换容器Bean时更适配Spring Boot的自动配置逻辑,还能直接复用Spring Boot的profile、外部配置文件等特性。 - 简化测试注解组合:不用手动拼
@ExtendWith+@ContextConfiguration+@WebAppConfiguration一堆注解,一个@SpringBootTest就能搞定大部分Spring Boot应用的集成测试需求。
内容的提问来源于stack exchange,提问作者work-in-progress
相关产品推荐
相关产品推荐

