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 实例的列表一起声明,每个 @ContextConfiguration 实例都定义了层次结构中的一个层级。以下示例演示了在单个测试类中使用 @ContextHierarchy 的方法(@ContextHierarchy 也可以在测试类层次结构中使用):
📄️ @ContextCustomizerFactories
@ContextCustomizerFactories是一个注解,可以应用于测试类,以便为该测试类、其子类以及嵌套类注册ContextCustomizerFactory的实现。如果您希望全局注册某个工厂,应通过“ContextCustomizerFactory配置”中描述的自动发现机制来进行注册。
📄️ @ActiveProfiles
@ActiveProfiles是一个注解,可以应用于测试类,用于声明在加载集成测试的ApplicationContext时哪些bean定义的配置文件应该是激活的。
📄️ @TestPropertySource
@TestPropertySource是一个可以应用于测试类的注解,用于配置属性文件的位置以及内联属性,这些属性将会被添加到为集成测试加载的ApplicationContext中的PropertySources集合中。
📄️ @DynamicPropertySource
@DynamicPropertySource是一个注解,可以应用于集成测试类中的方法。这些方法需要注册动态属性,以便将这些属性添加到为集成测试加载的ApplicationContext的环境(Environment)中的PropertySources集合中。当你在事先不知道这些属性的值时,动态属性就非常有用——例如,如果这些属性是由外部资源管理的,比如Testcontainers项目所管理的容器。
📄️ @TestBean
@TestBean被用于测试类中的非静态字段上,以用工厂方法提供的实例来覆盖测试的ApplicationContext中的特定bean。
📄️ @MockitoBean 和 @MockitoSpyBean
@MockitoBean 和 @MockitoSpyBean 可以在测试类中使用,分别用于用 Mockito 的模拟对象(mock)或监视器(spy)替换测试环境中的 ApplicationContext 中的 bean。在后一种情况下,原始 bean 的一个早期实例会被捕获并由 spy 所包装。
📄️ @DirtiesContext
@DirtiesContext 表示在测试执行过程中,底层的 Spring ApplicationContext 被破坏了(即测试以某种方式修改或损坏了它——例如,更改了单例bean的状态),因此应该关闭该 ApplicationContext。当一个应用程序上下文被标记为“脏”时,它将从测试框架的缓存中移除并关闭。因此,对于任何后续需要具有相同配置元数据的上下文的测试,底层 Spring 容器将会重新构建。
📄️ @TestExecutionListeners
@TestExecutionListeners 用于为带有该注解的测试类、其子类及其嵌套类注册监听器。如果你希望全局注册一个监听器,应通过 TestExecutionListener 配置中描述的自动发现机制来进行注册。
📄️ @RecordApplicationEvents
@RecordApplicationEvents是一种注解,可以应用于测试类,用来指示Spring TestContext框架在单个测试执行期间记录在ApplicationContext中发布的所有应用程序事件。
📄️ @Commit
@Commit 表示事务性测试方法在测试方法完成后应当进行提交。您可以使用 @Commit 直接替代 @Rollback(false),以更明确地表达代码的意图。与 @Rollback 类似,@Commit 也可以被声明为类级别或方法级别的注解。
📄️ @Rollback
@Rollback 指示在事务性测试方法执行完成后是否应该回滚该事务。如果值为 true,则会回滚事务;否则,事务将被提交(另请参见 @Commit)。即使在未显式声明 @Rollback 的情况下,Spring TestContext 架构中的集成测试的回滚默认也会设置为 true。
📄️ @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 对可重复注解的支持来使用它;在 Java 8 中,可以在同一个类或方法上多次声明 @Sql,这样会隐式地生成这个容器注解。以下示例展示了如何声明一个 SQL 组:
📄️ @DisabledInAotMode
@DisabledInAotMode 表示该带有注解的测试类在 Spring AOT(提前编译)模式下被禁用,这意味着在构建时,该测试类的 ApplicationContext 将不会被进行 AOT 优化处理。