Spring TestContext 框架
Spring TestContext 框架(位于 org.springframework.test.context
包中)提供了通用的、注解驱动的单元和集成测试支持,与所使用的测试框架无关。TestContext 框架还非常重视约定优于配置,提供了合理的默认值,您可以通过基于注解的配置进行覆盖。
除了通用的测试基础设施之外,TestContext 框架还为 JUnit 4、JUnit Jupiter(又称 JUnit 5)和 TestNG 提供了明确的支持。对于 JUnit 4 和 TestNG,Spring 提供了 abstract
支持类。此外,Spring 为 JUnit 4 提供了自定义的 JUnit Runner
和自定义的 JUnit Rules
,以及为 JUnit Jupiter 提供了自定义的 Extension
,这些都允许你编写所谓的 POJO 测试类。POJO 测试类不需要继承特定的类层次结构,比如 abstract
支持类。
章节摘要
📄️ 关键抽象
该框架的核心由 TestContextManager 类和 TestContext、TestExecutionListener、SmartContextLoader 接口组成。每个测试类都会创建一个 TestContextManager(例如,在 JUnit Jupiter 中执行单个测试类中的所有测试方法)。TestContextManager 负责管理一个 TestContext,它保存当前测试的上下文。随着测试的进行,TestContextManager 还会更新 TestContext 的状态,并委托给 TestExecutionListener 的实现,这些实现通过提供依赖注入、管理事务等方式来辅助实际的测试执行。SmartContextLoader 负责为给定的测试类加载一个 ApplicationContext。有关更多信息和各种实现的示例,请参阅 javadoc 和 Spring 测试套件。
📄️ 引导 TestContext 框架
Spring TestContext 框架内部的默认配置足以满足所有常见的用例。然而,有时开发团队或第三方框架可能希望更改默认的 ContextLoader,实现自定义的 TestContext 或 ContextCache,扩展默认的 ContextCustomizerFactory 和 TestExecutionListener 实现集合,等等。对于这种对 TestContext 框架操作方式的低级控制,Spring 提供了一种引导策略。
📄️ TestExecutionListener 配置
Spring 提供了以下默认注册的 TestExecutionListener 实现,注册顺序如下:
📄️ 应用事件
TestContext 框架提供支持,用于记录在 ApplicationContext 中发布的应用程序事件,以便可以在测试中对这些事件进行断言。在单个测试执行期间发布的所有事件都可以通过 ApplicationEvents API 获得,该 API 允许您将事件作为 java.util.Stream 进行处理。
📄️ 测试执行事件
EventPublishingTestExecutionListener 提供了一种实现自定义 TestExecutionListener 的替代方法。测试的 ApplicationContext 中的组件可以监听 EventPublishingTestExecutionListener 发布的以下事件,每个事件都对应于 TestExecutionListener API 中的方法。
🗃️ 上下文管理
15 个项目
📄️ 测试夹具的依赖注入
当你使用 DependencyInjectionTestExecutionListener(默认配置)时,你的测试实例的依赖项将从你使用 @ContextConfiguration 或相关注解配置的应用上下文中的 bean 中注入。你可以使用 setter 注入、字段注入或两者兼而有之,具体取决于你选择的注解以及你将它们放置在 setter 方法还是字段上。如果你使用的是 JUnit Jupiter,你还可以选择使用构造函数注入(参见使用 SpringExtension 的依赖注入)。为了与 Spring 的基于注解的注入支持保持一致,你还可以使用 Spring 的 @Autowired 注解或来自 JSR-330 的 @Inject 注解进行字段和 setter 注入。
📄️ 测试中的 Bean 覆盖
在测试中覆盖 Bean 是指通过为测试类或测试类中的一个或多个非静态字段添加注解,来覆盖 ApplicationContext 中特定的 Bean 的能力。
📄️ 测试请求和会话范围的 Bean
Spring 自早期以来就支持请求范围和会话范围的 bean,您可以通过以下步骤测试您的请求范围和会话范围的 bean:
📄️ 事务管理
在 TestContext 框架中,事务由 TransactionalTestExecutionListener 管理,该监听器是默认配置的,即使您没有在测试类上显式声明 @TestExecutionListeners。要启用事务支持,您必须在使用 @ContextConfiguration 语义加载的 ApplicationContext 中配置一个 PlatformTransactionManager bean(稍后将提供更多详细信息)。此外,您必须在测试的类级别或方法级别声明 Spring 的 @Transactional 注解。
📄️ 执行 SQL 脚本
在针对关系数据库编写集成测试时,通常运行 SQL 脚本来修改数据库模式或向表中插入测试数据是有益的。spring-jdbc 模块提供了通过在加载 Spring ApplicationContext 时执行 SQL 脚本来初始化嵌入式或现有数据库的支持。有关详细信息,请参阅嵌入式数据库支持和使用嵌入式数据库测试数据访问逻辑。
📄️ 并行测试执行
Spring TestContext 框架为在单个 JVM 中并行执行测试提供了基本支持。通常,这意味着大多数测试类或测试方法可以在不更改测试代码或配置的情况下并行运行。
📄️ TestContext 框架支持类
本节描述了支持 Spring TestContext 框架的各种类。
📄️ 测试的提前支持
本章介绍使用 Spring TestContext 框架进行集成测试的 Spring 预编译(AOT)支持。