SpringBoot单元测试(一)

350 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

Spring Boot 模块独立测试

Spring Boot 支持各模块单独隔离测试,例如web, db。单独测试各模块时不需要启动整个spring上下文,通过禁用一些spring boot自动配置来实现。

Spring Boot Test Slices Overview and Usage
rieckpil.de/spring-boot…

@WebMvcTest 测试web层

@WebMvcTest 测试web层,controller层,不包括service层。

@WebMvcTest 注解主要用于controller层测试,只覆盖应用程序的controller层,HTTP请求和响应是Mock出来的,因此不会创建真正的连接。因此需要创建 MockMvc bean进行模拟接口调用。
如果Controller层对Service层中的其他bean有依赖关系,那么需要使用Mock提供所需的依赖项。
WebMvcTest要快得多,因为我们只加载了应用程序的一小部分。

@DataJpaTest 测试jpa

@DataJpaTest 测试jpa @Repository EntityManager TestEntityManager DataSource

@DataJpaTest 注解会禁用 spring boot 的其他自动配置,只保留 jpa 测试相关的。

默认情况下 @DataJpaTest 注解的测试类都是事务型的,测试方法结束后会回滚操作。
默认情况下 @DataJpaTest 会启动一个内存数据库,例如 H2 或 Derby,来代替其他数据库。配合使用 @AutoConfigureTestDatabase 注解来自动配置一个测试库。
如果想加载全部spring上下文,同时使用内存数据库,应该使用 @SpringBootTest 搭配 @AutoConfigureTestDatabase 注解来实现。

@DataJpaTest 注解的测试类中可以直接注入 TestEntityManager 来作为 EntityManager 使用。
如果想在 @DataJpaTest 外使用 TestEntityManager, 需要添加 @AutoConfigureTestEntityManager 注解

TestEntityManager NullPointerException

一开始注入的 TestEntityManager 一直是 null,后来加上 @RunWith(SpringRunner.class) 就好了

有 @DataJpaTest 而不启动 Spring 上下文时,可以直接注入 TestEntityManager 使用
如果不使用 @DataJpaTest 而是启动Spring上下文的话,就没有 TestEntityManager 实例可注入了,需要改为注入 EntityManager

Test Your Spring Boot JPA Persistence Layer With @DataJpaTest
rieckpil.de/test-your-s…


@JdbcTest 测试jdbc

@JdbcTest 测试jdbc


@DataMongoTest 测试mongo

@DataMongoTest 测试mongo

@DataMongoTest 注解会禁用 spring boot 的其他自动配置,只保留 mongo 测试相关的。


@JsonTest 测试json

@JsonTest 测试json序列化、反序列化


@RestClientTest 测试http客户端

@RestClientTest 测试http客户端


@SpringBootTest 测试springboot应用

@SpringBootTest 测试spring boot应用,各种service层。


@Transactional 测试数据自动回滚

可以实现再springboot中使用junit编写单元测试,并且测试结果不影响数据库。

@Transactional 表示该方法整体为一个事务,可以用在测试类上表示所有测试方法都回滚,或具体的 @Test 方法上。
@Rollback 表示事务执行完回滚,支持传入一个参数value,默认true即回滚,false不回滚。


使用MockMvc测试Spring MVC Controller

用到的注解:
@RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
@WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启动一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;
@ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;controller,component等都是使用注解,需要注解指定spring的配置文件,扫描相应的配置,将类初始化等。
@TransactionConfiguration(transactionManager=”transactionManager”,defaultRollback=true)配置事务的回滚,对数据库的增删改都会回滚,便于测试用例的循环利用

为什么要进行事务回滚:
1、测试过程对数据库的操作,会产生脏数据,影响我们数据的正确性
2、不方便循环测试,即假如这次我们将一个记录删除了,下次就无法再进行这个Junit测试了,因为该记录已经删除,将会报错。
3、如果不使用事务回滚,我们需要在代码中显式的对我们的增删改数据库操作进行恢复,将多很多和测试无关的代码

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。