单元测试 | ruoyi-vue-璇泰初网络
GitHub (opens new window)
目录

单元测试

项目使用 Junit5 + Mockito 实现单元测试,提升代码质量、重复测试效率、部署可靠性等。

截止目前,项目已经有 500+ 测试用例。

内容推荐

如果你想系统学习单元测试,可以阅读《有效的单元测试》 (opens new window)这本书,非常适合 Java 工程师。

如果只是想学习 Spring Boot Test 的话,可以阅读 《芋道 Spring Boot 单元测试 Test 入门 》 (opens new window) 文章。

# 1.测试组件

yudao-spring-boot-starter-test (opens new window) 是项目提供的测试组件,用于单元测试、集成测试等等。

# 1.1 快速测试的基类

测试组件提供了 4 种单元测试的基类,通过继承它们,可以快速的构建单元测试的环境。

基类 作用
BaseMockitoUnitTest (opens new window) 纯 Mockito 的单元测试
BaseDbUnitTest (opens new window) 使用内嵌的 H2 数据库的单元测试
BaseRedisUnitTest (opens new window) 使用内嵌的 Redis 缓存的单元测试
BaseDbAndRedisUnitTest (opens new window) 使用内嵌的 H2 数据库 + Redis 缓存的单元测试

疑问:什么是内嵌的 Redis 缓存?

基于 jedis-mock (opens new window) 开源项目,通过 RedisTestConfiguration (opens new window) 配置类,启动一个 Redis 进程。一般情况下,会使用 16379 端口。

# 1.2 测试工具类

RandomUtils (opens new window) 基于 podam (opens new window) 开源项目,实现 Bean 对象的随机生成。

AssertUtils (opens new window) 封装 Junit 的 Assert 断言,实现 Bean 对象的断言,支持忽略部分属性。

# 2. BaseDbUnitTest 实战案例

以字典类型模块的 DictTypeServiceImpl (opens new window) 为例子,讲解它的 DictTypeServiceTest (opens new window) 单元测试的编写实现。

# 2.1 引入依赖

yudao-module-system-biz 模块中,引入 yudao-spring-boot-starter-test 技术组件。如下所示:

<dependency>
    <groupId>cn.iocoder.boot</groupId>
    <artifactId>yudao-spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

# 2.2 新建 ut 配置文件

test/resources (opens new window) 目录,新建单元测试的 application-unit-test.yaml (opens new window) 配置文件,内容如下:

application-unit-test.yaml` 配置文件

# 2.3 添加 H2 SQL 脚本

修改 test/resources/sql (opens new window) 目录的两个 H2 SQL 脚本:

① 在 create_tables.sql (opens new window) 文件中,添加 system_dict_type 的 H2 建表语句。SQL 如下:

CREATE TABLE IF NOT EXISTS "system_dict_type" (
    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    "name" varchar(100) NOT NULL DEFAULT '',
    "type" varchar(100) NOT NULL DEFAULT '',
    "status" tinyint NOT NULL DEFAULT '0',
    "remark" varchar(500) DEFAULT NULL,
    "creator" varchar(64) DEFAULT '',
    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updater" varchar(64) DEFAULT '',
    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "deleted" bit NOT NULL DEFAULT FALSE,
    PRIMARY KEY ("id")
) COMMENT '字典类型表';

注意,H2 和 MySQL 的建表语句有区别,需要手动进行转换。如果你不想进行转换,可以使用 [基础设置 -> 代码生成] 菜单的代码生成器功能,如下图所示:

基础设置 -> 代码生成

② 在 clean.sql (opens new window) 文件中,添加 system_dict_type 的清空数据的语句。SQL 如下:

DELETE FROM "system_dict_type";

每次单元测试的方法执行完后,会执行 clean.sql 脚本,进行数据的清理,保证每个单元测试的方法的数据隔离性。

# 2.3 新建 DictTypeServiceTest 类

新建 DictTypeServiceTest 测试类,继承 BaseMockitoUnitTest 基类,并完成它的配置。代码如下图所示:

DictTypeServiceTest 总体

  • 属于自己模块的,使用 Spring 初始化成真实的 Bean,然后通过 @Resource 注入。例如说:dictTypeServicedictTypeMapper
  • 属于别人模块的,使用 Spring @MockBean 注解,模拟 Mock 成一个 Bean 后注入。例如说:dictDataService

疑问:为什么有的进行 Mock,有的不进行 Mock 呢?

  • 单元测试需要避免对外部的依赖,而 dictDataService 是外部依赖,所以需要 Mock 掉。
  • dictTypeMapper 某种程度来说,也是一种外部依赖,但是通过内嵌的 H2 内存数据库,进行“真实”的数据库操作,反而单元测试的编写效率更高,效果更好,所以不需要 Mock 掉。

另外,[基础设置 -> 代码生成] 菜单的代码生成器功能,已经生成了绝大多数的单元测试的逻辑,这里主要是希望让你了解单元测试的具体使用,所以并没有使用它。如下图所示:

基础设置 -> 代码生成

# 2.4 新增方法的单测

# 2.5 修改方法的单测

# 2.6 删除方法的单测

# 2.7 单条查询方法的单测

# 2.8 分页查询方法的单测

# 3. BaseMockitoUnitTest 实战案例

一些类由于不依赖 MySQL 和 Redis,可以通过继承 BaseMockitoUnitTest 基类,实现纯 Mockito 的单元测试。例如说 SmsSendServiceTest (opens new window) 单元测试类,代码如下:

具体 SmsSendServiceTest 的每个测试方法,和 DictTypeServiceTest 并没有什么差别,还是 Mock 模拟 + Assert 断言 + Verify 调用,你可以自己花点时间瞅瞅。

×

相关内容推荐

seo pr 啥意思天津seo付费推广SEO项目总监招聘网络优化seo技术2018淘宝seo规则seo站内优化营销节能设备seo策略石家庄自然seo常州seo外包收费搜索SEO快排seo就业岗位要求抖音seo培训seo学习框架技术seo刷词工具广州谷歌seo工具seo服务工程肇庆seo代运营东营品牌seo优化美业seo案例东港seo推广网站seo的负面因素seo与大学专业重庆seo新站收录seo新手必看营销济宁网站seo电话珠海校园seo托管全南seo优化公司自贡seo推广价格天柱seo优化公司seo策略详细教程处理事件seo网站seo如何推广seo与标题不同seo博客by zblogseo1 tseo专员营销思路seo经理招工信息seo怎么选择主机6080seo1seo行情分析哪里有seo外包seo按照优化对象阳新seo哪里做自我介绍seoseo自学网免费站长seo如何提高seo优化师证书seo快站视频批量导入seo后果品牌seo sem方案潍坊seo优化网站长治网络推广seo浦东网站seo培训新浪seo综合分析sabic 310seo海珠seo首页优化seo实战密码 作者鹤壁seo推广费用seo人才辈出全国seo公司加盟什么源码利于seoseo苦逼吗SEO写作赚钱图片商洛seo网站推广SEO写作素材软件济南网站seo推广seo的含义为han i-seo外贸seo的课程seo斗篷法教程汕头seo优化大全高清搜狗seo优化罗湖seo搜索优化朝阳专业seo排名seo优化教程谷歌SEO流量运营系统湛江seo优化电话咸宁seo自学网seo的长尾理论seo推送源码下载sem和seo待遇凉山seo优化价格seo中外链优化日照seo外包报价站内seo检测软件正规seo多少费用seo营销留痕日照seo优化公司大同seo优化咨询seo是什么生肖租车网站seo优化福建seo优化排行芜湖谷歌seo品牌武汉seo软件软件seo内容页浏览无线seo是什么seo培训海瑶常德搜狗seo优化湖北镇江seoSEO学习壁纸ipad鸿科经纬seo威海网站seo推广鄂州seo推广价格苏州seo页面优化seo大客户销售沅江310seo贺州整站seo优化苏州seo公司报价广西seo怎么选台州seo推广外包鹰潭310seo韩国演员SEO贤nuxt可以SEO吗莱芜seo优化推广大同seo优化技巧麒麟seo软文群高邮seo优化公司定南seo快速排名比较sem和seoseo矩阵怎么玩seo常用统计报表seo计费管理系统河南seo培训学校seo网站可观流量seo基础优化推广白帽seo首页翻译内容谷歌seoseo客户经理江宁seo短视频seo平台适合火星seo优化方案格式淘宝 seo 知乎seo营销地址临沂seo新站优化掘金短视频seo济宁seo优化推广SEO作业及答案深圳顺时科技seo军民网seo张立seo新人如何培训抚顺seo优化服务柳州seo推广网站蓝天seo官网重庆兼职seo顾问seo文章怎么收录seo做产品页面sem seo网络优化大连seo鱼刺系统阳江seo优化推荐合肥seo招工信息济南seo优化运营手机 seo排名工具南宁seo优化价格谷歌seo标题分析seo区综合查询商丘凡哥seoSEO文案温柔发型湖州新站seo优化设备seo优化平台上海seo用户体验福州怎样做seowordpress和seo权重湛江seo外包优化seo交易快速推广新安seo优化代理seo刻羽云阳江整站seo优化怎么写seo软文墨子学院seo优化营口seo网络推广黄州seo哪家好seo技引擎优化北京企业seo推广山东网站seo策划淘宝SEO思考框架seo死链接优化技术好seo公司seo软文写作教程武穴seo推广定位湖北SEO源头厂家泊头网站seo优化为seo提供产品lee seo young图集谷歌seo推广运营临沂seo布局优化佛山seo做排名自贡SEO鱼刺系统外贸seo网站系统seo出来做什么引擎优化seo优惠seo工作做什么白山谷歌seoseo思维的强大Lim Seo-rimseo技术课堂什么是seo教案SEO策略师濮阳SEO鱼刺系统揭阳seo代理计费sem.seo区别

合作伙伴

璇泰初网络

www.hz.bj.cn
www.akz.net.cn
www.zhdaili.cn
www.desai360.com
www.chaoshanxing.com
www.ddtxly.cn
seo.xtcwl.com
www.bjdongwei.cn
www.hz.bj.cn
www.kmpower.cn
www.3phw.com
www.seo5951.com
zz.urkeji.com
seo.china185.com
www.akz.net.cn
www.snlanyards.com
dw.urkeji.com
www.hz.bj.cn
www.28j.com.cn
www.clhczx.cn