【快学springboot】在springboot中写单元测试
前言
很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码。写单元测试,也是保证代码质量的一种方式。
junit单元测试
相信绝大多数的Java开发者都用过Junit来写单元测试。
引入依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
复制代码
直接在方法上加上@Test注解即可:
加了@Test注解,就会有一个运行的图标了。
spring的依赖问题
现在的Java开发,基本上离不开spring了。但是使用spring,写单测的时候就会存在一个依赖注入的问题。
假设有如下一个Service:
@Service
public class TestService {
public String getString() {
return "Hello World!";
}
}
复制代码
在Junit中直接自动装配:
public class JunitTest {
@Autowired
private TestService testService;
@Test
public void test() {
System.out.println(testService.getString());
}
}
复制代码
运行报错:
springboot写单元测试
在springboot中,解决spring依赖问题,非常的简单。只需要它提供的几个注解即可:
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
复制代码
这里引入了一个spring-boot-starter-test依赖,是springboot中写单测所需要的。
在单元测试类上添加@RunWith(SpringRunner.class)、@SpringBootTest注解:
这时候就可以正常的把spring依赖注入进来了,运行方法,可以看到springboot启动时的输出:
如果是通过spring initialize创建的springboot项目(本系列第一篇文章有讲解),其实会自动创建一个单元测试类:
我们在写单元测试的时候,直接继承这个类即可。
单元测试事务回滚
写单元测试,难免需要操作数据库。有时候单元测试的数据库跟开发时候的数据库是同一个,为了不影响数据库的数据,需要在单测完成之后,将操作回滚。这在springboot中也是很容易解决的事情,只需要将单测类继承AbstractTransactionalJUnit4SpringContextTests即可
数据库有数据如下:
单元测试类如下:
测试方法如下:
@Test
public void deleteAll() {
userRepo.deleteAll();
}
复制代码
执行方法后,如果事务不会滚,则会清除user表中的所有数据。
通过结果查看,单测运行没有问题,查看数据库:
数据也没有被删除,证明事务已经回滚了。
把继承的AbstractTransactionalJUnit4SpringContextTests类去掉,再次执行deleteAll方法:
数据库中的数据已被删除
总结
本文介绍了springboot中写单元测试的方法。其实优雅的写单元测试需要涉及到很多东西,比如mock(mockito、mockmvc等),本文都没有涉及,有兴趣的可以了解下。
- Spring Boot下的TDD(测试驱动开发)
- MySQL的索引是什么?怎么优化?
- C语言之函数
- ElasticSearch搜索引擎在SpringBoot中的实践
- 消费者驱动的微服务契约测试套件Spring Cloud Contract
- 使用Spring Boot开发一个Spring Mobile程序
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
- 内网穿透工具-ittun
- Elastic-Job-Spring-Boot-Starter简化你的任务配置
- Spring Boot处理REST API错误的正确姿势
- C语言之位运算
- C语言之预处理命令与用typedef命名已有类型
- spring-data-mongodb之MongoTemplate 删除操作
- 总结了一些指针易出错的常见问题(六)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux下文本的简单处理(awk和sed)
- Spring4定时器 cronTrigger和simpleTrigger实现方法
- Tomcat远程调试
- IDEA建立Spring MVC Hello World 详细入门教程
- 嗯,手搓一个TinyPng压缩图片的WebpackPlugin也SoEasy啦
- Spring源码解析——核心类介绍
- IO之Basic IO
- 静态方法中注入bean
- 高通量数据中批次效应的鉴定和处理(五)- 预测并校正可能存在的混杂因素
- JVM 学习笔记(一)
- JVM 学习笔记(二)
- JVM 学习笔记(三)
- 算法数据结构 | 图论基础算法——拓扑排序
- JVM 学习笔记(四)
- Python 如何实时绘制数据