跳到主要内容

Spring TestContext 框架

ChatGPT-4o 中英对照 Spring TestContext Framework

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 支持类。

以下部分概述了 TestContext 框架的内部结构。如果您只对使用框架感兴趣,而不打算通过自定义监听器或自定义加载器来扩展它,可以直接查看配置(上下文管理依赖注入事务管理)、支持类注解支持 部分。

章节摘要

📄️ 关键抽象

该框架的核心由 TestContextManager 类和 TestContext、TestExecutionListener、SmartContextLoader 接口组成。每个测试类都会创建一个 TestContextManager(例如,在 JUnit Jupiter 中执行单个测试类中的所有测试方法)。TestContextManager 负责管理一个 TestContext,它保存当前测试的上下文。随着测试的进行,TestContextManager 还会更新 TestContext 的状态,并委托给 TestExecutionListener 的实现,这些实现通过提供依赖注入、管理事务等方式来辅助实际的测试执行。SmartContextLoader 负责为给定的测试类加载一个 ApplicationContext。有关更多信息和各种实现的示例,请参阅 javadoc 和 Spring 测试套件。

📄️ 测试夹具的依赖注入

当你使用 DependencyInjectionTestExecutionListener(默认配置)时,你的测试实例的依赖项将从你使用 @ContextConfiguration 或相关注解配置的应用上下文中的 bean 中注入。你可以使用 setter 注入、字段注入或两者兼而有之,具体取决于你选择的注解以及你将它们放置在 setter 方法还是字段上。如果你使用的是 JUnit Jupiter,你还可以选择使用构造函数注入(参见使用 SpringExtension 的依赖注入)。为了与 Spring 的基于注解的注入支持保持一致,你还可以使用 Spring 的 @Autowired 注解或来自 JSR-330 的 @Inject 注解进行字段和 setter 注入。