引用

目标

在两次测试之间上下文:管理(Context Management)和缓存(Context Caching)

默认情况下,配置的ApplicationContext加载后将重新用于每个测试。(被破坏时(修改bean)重载)

测试Bean的依赖注入

通过在应用程序上下文中使用预配置的 bean 来设置测试装置。

事务管理(TransactionManagement)

默认情况下,框架为每个测试创建并回滚事务。

如果要提交事务,则可以通过使用@CommitComments 告诉 TestContext 框架来提交事务,不回滚。

集成测试支持类

Spring TestContext Framework 提供了几个abstract支持类,这些类简化了集成测试的编写。

  • ApplicationContext,用于执行显式的 bean 查找或测试整个上下文的状态。
  • JdbcTemplate,用于执行 SQL 语句来查询数据库。 Spring 确保此类查询在与应用程序代码相同的事务范围内运行。与 ORM 工具结合使用时,请务必避免使用false positives。

JDBC 测试支持

org.springframework.test.jdbc软件包包含JdbcTestUtils,这是 JDBC 相关 Util 功能的集合,旨在简化标准数据库测试方案

  • countRowsInTable(..):计算给定表中的行数。
  • countRowsInTableWhere(..):使用提供的WHERE子句计算给定表中的行数。
  • deleteFromTables(..):删除指定表中的所有行。
  • deleteFromTableWhere(..):使用提供的WHERE子句从给定表中删除行。
  • dropTables(..):删除指定的表。

注解

启动测试类型的注解

所有的@XXXTest注解都被 @BootstrapWith 注解,它们可以启动ApplicationContext,是测试的入口,所有的测试类必须声明一个@XXXTest注解。

注解作用
@SpringBootTest自动侦测并加载@SpringBootApplication或@SpringBootConfiguration中的配置 (独有),默认web环境为MOCK,不监听任务端口
@DataRedisTest测试对Redis操作,自动扫描被@RedisHash描述的类,并配置Spring Data Redis的库
@DataJpaTest测试基于JPA的数据库操作,同时提供了TestEntityManager替代JPA的EntityManager
@DataJdbcTest测试基于Spring Data JDBC的数据库操作
@JsonTest测试JSON的序列化和反序列化
@WebMvcTest测试Spring MVC中的controllers
@WebFluxTest测试Spring WebFlux中的controllers
@RestClientTest测试对REST客户端的操作
@DataLdapTest测试对LDAP的操作
@DataMongoTest测试对MongoDB的操作
@DataNeo4jTest测试对Neo4j的操作

除了@SpringBootTest之外的注解都是用来进行切面测试的,他们会默认导入一些自动配置

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(SpringBootTestContextBootstrapper.class)
public @interface SpringBootTest {
    @AliasFor("properties")
    String[] value() default {};

    @AliasFor("value")
    String[] properties() default {};

    Class<?>[] classes() default {};

    SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.MOCK;

    public static enum WebEnvironment {
        MOCK(false),
        RANDOM_PORT(true),
        DEFINED_PORT(true),
        NONE(false);

        private final boolean embedded;

        private WebEnvironment(boolean embedded) {
            this.embedded = embedded;
        }

        public boolean isEmbedded() {
            return this.embedded;
        }
    }
}

valueproperties同意义,添加配置属性到Spring!例:(properties = "name=fhc")
classes指定配置类,没有指定则查找嵌套的@Configuration类,然后返回到SpringBootConfiguration搜索配置
webEnvironment指定web环境

  1. MOCK:默认值,模拟环境,servlet不启动,也不监听端口。
  2. RANDOM_PORT:真实环境,随机监听端口
  3. DEFINED_PORT:真实环境,监听配置中的端口
  4. NONE:启动一个非web的ApplicationContext,既不提供mock环境,也不提供真是的web服务

配置类型注解

注解作用使用
@TestComponent该注解另一种@Component,在语义上用来指定某个Bean是专门用于测试的。开发环境时会被剔除该注解适用于测试代码和正式混合在一起时,不加载被该注解描述的Bean。
@TestConfiguration该注解是另一种 @TestComponent ,它用于补充额外的Bean或覆盖已存在的Bean在不修改正式代码的前提下,使配置更加灵活
@TypeExcludeFilters用来排除@TestConfiguration和@TestComponent适用于测试代码和正式代码混合的场景
@OverrideAutoConfiguration可用于覆盖@EnableAutoConfiguration,与ImportAutoConfiguration结合使用,以限制所加载的自动配置类在不修改正式代码的前提下,提供了修改配置自动配置类的能力
@PropertyMapping定义属性映射

mock类型的注解

注解作用
@MockBean模拟一个类@MockBean UserService userService;
@MockBeans批量模拟类@MockBeans(value = {@MockBean (UserService.class)}),使用时通过注入@Autowired
@SpyBean用于spy指定的class或被注解的属性
@SpyBeans使@SpyBeans支持在同一类型或属性上多次出现

MockBean是全新的对象,跟正式对象没有关系;而SpyBean与正式对象紧密联系,可以模拟正式对象的部分方法,没有被模拟的方法仍然可以运行正式代码。

自动配置类型的注解

注解作用
@AutoConfigureJdbc自动配置JDBC
@AutoConfigureCache自动配置缓存
@AutoConfigureDataLdap自动配置LDAP
@AutoConfigureJson自动配置JSON
@AutoConfigureJsonTesters自动配置JsonTester
@AutoConfigureDataJpa自动配置JPA
@AutoConfigureTestEntityManager自动配置TestEntityManager
@AutoConfigureRestDocs自动配置Rest Docs
@AutoConfigureMockRestServiceServer自动配置 MockRestServiceServer
@AutoConfigureWebClient自动配置 WebClient
@AutoConfigureWebFlux自动配置 WebFlux
@AutoConfigureWebTestClient自动配置 WebTestClient
@AutoConfigureMockMvc自动配置 MockMvc
@AutoConfigureWebMvc自动配置WebMvc
@AutoConfigureDataNeo4j自动配置 Neo4j
@AutoConfigureDataRedis自动配置 Redis
@AutoConfigureJooq自动配置 Jooq
@AutoConfigureTestDatabase自动配置Test Database,可以使用内存数据库

这些注解可以搭配@ \xxxTest使用,用于开启在@ \xxxTest中未自动配置的功能。例如 @SpringBootTest和 @AutoConfigureMockMvc组合后,就可以注入org.springframework.test.web.servlet.MockMvc。
“自动配置类型”有两种使用方式:

  1. 在功能测试(即使用@SpringBootTest)时显示添加。

  2. 一般在切片测试中被隐式使用,例如@WebMvcTest注解时,隐式添加了@AutoConfigureCache、@AutoConfigureWebMvc、@AutoConfigureMockMvc。