该框架的核心由 TestContextManager 类和 TestContext、TestExecutionListener 和 SmartContextLoader 接口组成。为每个测试类创建一个TestContextManager(例如,为执行 JUnit Jupiter 中一个测试类中的所有测试方法)。TestContextManager 反过来管理一个 TestContext,它持有当前测试的上下文。TestContextManager 还随着测试的进展更新 TestContext 的状态,并委托给 TestExecutionListener 实现,该实现通过提供依赖性注入、管理事务等来记录实际的测试执行。SmartContextLoader 负责为一个给定的测试类加载一个 ApplicationContext。参见javadoc 和 Spring 测试套件,以获得更多信息和各种实现的例子。

TestContext

TestContext 封装了运行测试的上下文(与实际使用的测试框架无关),并为它所负责的测试实例提供上下文管理和缓存支持。TestContext 也委托给 SmartContextLoader 来加载 ApplicationContext(如果需要)。

TestContextManager

TestContextManager 是进入 Spring TestContext 框架的主要入口,负责管理单个 TestContext,并在明确定义的测试执行点向每个注册的 TestExecutionListener 发出事件信号:

  • 在某一测试框架的任何 「before class」 或 「before all」方法之前。
  • 测试实例后置处理(post-processing)。
  • 在特定测试框架的任何 「before」或 「before each(每个方法之前)」的方法之前。
  • 紧接着执行测试方法之前,但在测试设置之后。
  • 紧接着测试方法的执行,但在测试拆除之前。
  • 在某一测试框架的任何 「after」或 「after each」方法之后。
  • 在某一测试框架的任何 「after class」或 「after all」方法之后。

上述的描述其实感觉就是一个生命周期:从测试开始的类实例、方法执行,到测试结束,这期间的生命周期触发点

TestExecutionListener

TestExecutionListener 定义了对由监听器注册的 TestContextManager 发布的测试执行事件做出反应的 API。参见 TestExecutionListener 配置。

Context Loaders

ContextLoader 是一个策略接口,用于为 Spring TestContext 框架管理的集成测试加载一个 ApplicationContext。你应该实现 SmartContextLoader 而不是这个接口,以提供对组件类、活动 bean 定义配置文件、测试属性源、上下文层次结构和 WebApplicationContext 的支持。

SmartContextLoader 是 ContextLoader 接口的一个扩展,它取代了原来最小的 ContextLoader SPI。具体来说,SmartContextLoader 可以选择处理资源位置、组件类或上下文初始化器。此外,SmartContextLoader 可以在它加载的上下文中设置活动的 bean 定义配置文件和测试属性源。

Spring 提供了以下实现:

  • DelegatingSmartContextLoader:两个默认加载器之一,它在内部委托给 AnnotationConfigContextLoader、GenericXmlContextLoader 或 GenericGroovyXmlContextLoader,取决于为测试类声明的配置或默认位置或默认配置类的存在。只有当 Groovy 在 classpath 上时才会启用 Groovy 支持。

  • WebDelegatingSmartContextLoader:两个默认加载器之一,它在内部委托给 AnnotationConfigWebContextLoader、 GenericXmlWebContextLoader 或 GenericGroovyXmlWebContextLoader,取决于为测试类声明的配置或默认位置或默认配置类的存在。只有在测试类上存在 @WebAppConfiguration 的情况下才会使用 Web ContextLoader。只有当 Groovy 在 classpath 上时才会启用 Groovy 支持。

  • AnnotationConfigContextLoader:从组件类中加载一个标准的 ApplicationContext。

  • AnnotationConfigWebContextLoader:从组件类中加载一个 WebApplicationContext。

  • GenericGroovyXmlContextLoader:从 Groovy 脚本或 XML 配置文件的资源位置加载一个标准的 ApplicationContext。

  • GenericGroovyXmlWebContextLoader:从 Groovy 脚本或 XML 配置文件的资源位置加载一个 WebApplicationContext。

  • GenericXmlContextLoader:从 XML 资源位置加载一个标准的 ApplicationContext。

  • GenericXmlWebContextLoader:从 XML 资源位置加载一个 WebApplicationContext。