spring-boot-test与 spring-boot-starter-test 区别
spring-boot-test
和 spring-boot-starter-test
是 Spring Boot 测试中两个紧密相关但角色完全不同的组件。
简单来说,它们的核心区别是:
spring-boot-starter-test
:一个 Starter,它本身不包含功能代码,而是一个依赖项的集合。它的目的是为了方便地引入所有测试需要的库。spring-boot-test
:一个 核心模块,它包含了 Spring Boot 提供的实际测试功能代码和注解(如@SpringBootTest
)。
详细对比
为了更清晰地理解,我们用一个表格来对比:
特性 | spring-boot-starter-test (启动器) | spring-boot-test (核心模块) |
---|---|---|
角色 | 依赖管理工具 (Dependency Aggregator) | 功能提供者 (Functional Artifact) |
主要目的 | 一键导入所有常用的测试依赖,并确保它们的版本相互兼容。 | 提供 Spring Boot 特有的测试基础设施和注解。 |
包含内容 | 不包含实际功能代码,只包含一个 pom.xml 文件来定义依赖。 | 包含 @SpringBootTest , TestRestTemplate , MockMvc 等的实现代码。 |
依赖关系 | 依赖于 spring-boot-test 以及其他一大堆测试库(JUnit, Mockito, AssertJ等)。 | 是 spring-boot-starter-test 所依赖的众多组件之一。 |
如何使用 | 在你的项目 pom.xml 或 build.gradle 中声明它。 | 通常不需要直接声明,因为它会通过 spring-boot-starter-test 自动传递依赖进来。 |
深入理解:spring-boot-starter-test
包含了什么?
当你声明了 spring-boot-starter-test
,你实际上引入了以下一整套测试库:
spring-boot-test
: 提供 Spring Boot 测试的核心功能。spring-test
&spring-core
: Spring Framework 的测试上下文框架。JUnit Jupiter
(junit-jupiter
): 现代 JUnit 5 的 API 和引擎。Mockito
&Mockito JUnit Jupiter
: 流行的 Mock 框架及其与 JUnit 5 的集成。AssertJ
: 流式断言库,让断言更优雅、更强大。JsonPath
: 用于解析 JSON 数据的库,在测试中验证 JSON 响应非常方便。Hamcrest
(较老版本中): 另一个匹配器库(现在更推荐 AssertJ)。
应该如何选择?
99.9% 的情况下,你应该在你的 Spring Boot 项目中使用 spring-boot-starter-test
。
在你的 pom.xml
中这样写:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> <!-- 非常重要,确保这些依赖只用于测试 --><version>3.2.5</version> <!-- 使用你的Spring Boot版本 -->
</dependency>
什么情况下会直接使用 spring-boot-test
?
几乎不会。除非你的项目有非常特殊的需求,比如:
你只想使用
@SpringBootTest
注解,但希望自己手动管理所有其他测试库的版本。你在开发一个特殊的插件或工具,它只需要 Spring Boot 的测试基础设施,而不需要完整的测试套件(JUnit, Mockito 等)。
但这种场景极其罕见。直接引入 spring-boot-test
而不引入 spring-boot-starter-test
会导致你缺少 JUnit、Mockito 等核心测试框架,你需要手动把它们一个一个加回来,这完全违背了 Spring Boot Starter 简化配置的初衷。
总结
spring-boot-starter-test | spring-boot-test | |
---|---|---|
关系 | “购物车” | “购物车里的一个商品” |
你的操作 | 把整个“购物车”(starter-test )加入项目 | 购物车(starter-test )会自动把你想要的“商品”(spring-boot-test )带进来 |
结论 | 直接使用这个就行 | 不需要关心它,它是自动带来的 |
记住这个简单的法则:在 Spring Boot 项目中写测试,就引入 spring-boot-starter-test
。 它会帮你处理好一切。