Spring 测试注解
Spring 框架提供了一组特定于 Spring 的注解,您可以在单元测试和集成测试中与 TestContext 框架结合使用。有关更多信息,包括默认属性值、属性别名和其他细节,请参见相应的 javadoc。
Spring 的测试注解包括以下内容:
章节摘要
📄️ @BootstrapWith
@BootstrapWith 是一个可以应用于测试类的注解,用于配置 Spring TestContext 框架的引导方式。具体来说,您可以使用 @BootstrapWith 来指定一个自定义的 TestContextBootstrapper。有关引导 TestContext 框架的更多详细信息,请参见相关章节。
📄️ @ContextConfiguration
@ContextConfiguration 是一个可以应用于测试类的注解,用于配置元数据,以确定如何加载和配置 ApplicationContext 以进行集成测试。具体来说,@ContextConfiguration 声明了用于加载上下文的应用程序上下文资源位置或组件类。
📄️ @WebAppConfiguration
@WebAppConfiguration 是一个可以应用于测试类的注解,用于声明为集成测试加载的 ApplicationContext 应该是一个 WebApplicationContext。仅仅在测试类上存在 @WebAppConfiguration 就确保为测试加载一个 WebApplicationContext,使用默认值 \"file:src/main/webapp\" 作为 web 应用程序根路径(即资源基础路径)。资源基础路径在后台用于创建一个 MockServletContext,它作为测试的 WebApplicationContext 的 ServletContext。
📄️ @ContextHierarchy
@ContextHierarchy 是一个可以应用于测试类的注解,用于定义集成测试的 ApplicationContext 实例的层次结构。 @ContextHierarchy 应该与一个或多个 @ContextConfiguration 实例的列表一起声明,每个实例定义上下文层次结构中的一个级别。以下示例演示了在单个测试类中使用 @ContextHierarchy 的方法(@ContextHierarchy 也可以在测试类层次结构中使用):
📄️ @ContextCustomizerFactories
@ContextCustomizerFactories 是一个注解,可以应用于测试类,以注册特定测试类、其子类和嵌套类的 ContextCustomizerFactory 实现。如果您希望全局注册一个工厂,您应该通过 ContextCustomizerFactory Configuration 中描述的自动发现机制进行注册。
📄️ @ActiveProfiles
@ActiveProfiles 是一个可以应用于测试类的注解,用于声明在为集成测试加载 ApplicationContext 时应该激活哪些 bean 定义配置文件。
📄️ @TestPropertySource
@TestPropertySource 是一个可以应用于测试类的注解,用于配置属性文件的位置和内联属性,以便将其添加到为集成测试加载的 ApplicationContext 的 Environment 中的 PropertySources 集合中。
📄️ @DynamicPropertySource
@DynamicPropertySource 是一个注解,可以应用于集成测试类中的方法,这些方法需要注册动态属性,以便将其添加到为集成测试加载的 ApplicationContext 的 Environment 中的 PropertySources 集合中。当您不知道属性的值时,动态属性非常有用——例如,如果属性由外部资源管理,例如由 Testcontainers 项目管理的容器。
📄️ @TestBean
@TestBean 用于测试类中的非静态字段,以通过工厂方法提供的实例覆盖测试的 ApplicationContext 中的特定 bean。
📄️ @MockitoBean 和 @MockitoSpyBean
@MockitoBean 和 @MockitoSpyBean 可以在测试类中使用,以分别用 Mockito 模拟或间谍覆盖测试的 ApplicationContext 中的一个 bean。在后者的情况下,原始 bean 的早期实例被捕获并被间谍包装。
📄️ @DirtiesContext
@DirtiesContext 表示在测试执行过程中,底层的 Spring ApplicationContext 已经被污染(即测试以某种方式修改或损坏了它——例如,通过改变单例 bean 的状态),应该被关闭。当一个应用程序上下文被标记为脏时,它会从测试框架的缓存中移除并关闭。因此,对于任何后续需要相同配置元数据的上下文的测试,底层的 Spring 容器将被重建。
📄️ @TestExecutionListeners
@TestExecutionListeners 用于为注解的测试类、其子类和嵌套类注册监听器。如果您希望全局注册一个监听器,您应该通过 TestExecutionListener Configuration 中描述的自动发现机制进行注册。
📄️ @RecordApplicationEvents
@RecordApplicationEvents 是一个可以应用于测试类的注解,用于指示 Spring TestContext 框架在单个测试执行期间记录在 ApplicationContext 中发布的所有应用程序事件。
📄️ @Commit
@Commit 表示在事务测试方法完成后应提交事务。您可以使用 @Commit 直接替代 @Rollback(false),以更明确地传达代码的意图。与 @Rollback 类似,@Commit 也可以声明为类级别或方法级别的注解。
📄️ @Rollback
@Rollback 表示在事务测试方法完成后,事务是否应该回滚。如果为 true,则事务会被回滚。否则,事务将被提交(另见 @Commit)。在 Spring TestContext 框架中,集成测试的回滚默认设置为 true,即使没有明确声明 @Rollback。
📄️ @BeforeTransaction
@BeforeTransaction 表示注解的 void 方法应该在事务开始之前运行,适用于通过使用 Spring 的 @Transactional 注解配置为在事务内运行的测试方法。@BeforeTransaction 方法不要求是 public 的,并且可以在基于 Java 8 的接口默认方法中声明。
📄️ @AfterTransaction
@AfterTransaction 表示被注解的 void 方法应该在事务结束后运行,适用于通过使用 Spring 的 @Transactional 注解配置为在事务内运行的测试方法。@AfterTransaction 方法不需要是 public 的,也可以在基于 Java 8 的接口默认方法中声明。
📄️ @Sql
@Sql 用于注解测试类或测试方法,以配置在集成测试期间针对给定数据库运行的 SQL 脚本。以下示例展示了如何使用它:
📄️ @SqlConfig
@SqlConfig 定义了用于确定如何解析和运行使用 @Sql 注解配置的 SQL 脚本的元数据。以下示例展示了如何使用它:
📄️ @SqlMergeMode
@SqlMergeMode 用于注解测试类或测试方法,以配置方法级的 @Sql 声明是否与类级的 @Sql 声明合并。如果在测试类或测试方法上未声明 @SqlMergeMode,则默认使用 OVERRIDE 合并模式。在 OVERRIDE 模式下,方法级的 @Sql 声明将有效地覆盖类级的 @Sql 声明。
📄️ @SqlGroup
@SqlGroup 是一个容器注解,用于聚合多个 @Sql 注解。您可以原生使用 @SqlGroup 来声明多个嵌套的 @Sql 注解,或者可以将其与 Java 8 对可重复注解的支持结合使用,在同一个类或方法上可以多次声明 @Sql,从而隐式生成这个容器注解。以下示例展示了如何声明一个 SQL 组:
📄️ @DisabledInAotMode
@DisabledInAotMode 表示被注解的测试类在 Spring AOT(提前编译)模式下被禁用,这意味着测试类的 ApplicationContext 在构建时不会进行 AOT 优化处理。