引用
- http://ypk1226.com/2018/11/17/spring-boot/spring-boot-test-1/
- http://ypk1226.com/2018/11/20/spring-boot/spring-boot-test-2/
目标
在两次测试之间上下文:管理(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;
}
}
}
value与properties同意义,添加配置属性到Spring!例:(properties = "name=fhc")
classes指定配置类,没有指定则查找嵌套的@Configuration类,然后返回到SpringBootConfiguration搜索配置
webEnvironment指定web环境
- MOCK:默认值,模拟环境,servlet不启动,也不监听端口。
- RANDOM_PORT:真实环境,随机监听端口
- DEFINED_PORT:真实环境,监听配置中的端口
- 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。
“自动配置类型”有两种使用方式:
-
在功能测试(即使用@SpringBootTest)时显示添加。
-
一般在切片测试中被隐式使用,例如@WebMvcTest注解时,隐式添加了@AutoConfigureCache、@AutoConfigureWebMvc、@AutoConfigureMockMvc。