Spring 做单元测试

单元测试很重要,对于Spring项目,特别是测试Service层或者dao层的代码时。需要验证访问数据库的逻辑是否正确。测试Dao层的代码两种方式

使用外置数据库

测试环境在外置数据库里面。这种情况下如果外置的数据库里面的数据变化了。就可能会导致单元测试跑不过。这种方式也是大家常用的但是不规范。

使用内存数据库

内存数据库也是一个数据库,只不过是在内存里面。每次程序启动的时候,提前写好SQL文件。把数据写入,单元测试的时候访问的就是内存数据库里面的数据。所以只要代码的逻辑不出问题,每次访问和测试都是可以通过的。所以这种方式是比较规范的。但是难度也是稍微会大一点。

H2内存数据库介绍

H2是一个Java编写的关系型数据库,它可以被嵌入Java应用程序中使用,或者作为一个单独的数据库服务器运行。
H2数据库的前身是 HypersonicSQL,它的名字的含义是 Hypersonic2,但是它的代码是从头开始编写的,没有使用HypersonicSQL或者HSQLDB的代码

Spring和H2结合使用

第一步,引入H2 的maven配置

        <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.4.197</version><scope>runtime</scope></dependency>

第二步,添加创建数据库和基本数据的SQL文件

h2-schema.sql

这里放置你自己的数据的SQL文件

CREATE SCHEMA IF NOT EXISTS cmdb_docker;
CREATE TABLE `cmdb_docker`.`tb_publish_list` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`name` varchar(255) NOT NULL COMMENT '发布单名称',`project_name` varchar(255) NOT NULL COMMENT '应用名',`environment` varchar(255) NOT NULL COMMENT '环境信息,UAT或者线上',`status` varchar(255) NOT NULL COMMENT '发布状态',`image` varchar(255) NOT NULL COMMENT '镜像信息',`type` varchar(255) NOT NULL COMMENT '发布类型',`titan_id` bigint(20) DEFAULT NULL COMMENT '云效id',`git_commit_id` varchar(255) DEFAULT NULL,`superior` varchar(255) NOT NULL COMMENT '无损,强制',`is_health_check` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否健康检查',`is_gated_launch` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否灰度发布',`is_traffic_publish` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否预发布,流量调度',`ignore_direct_connection` tinyint(1) NOT NULL DEFAULT '0' COMMENT '无流量检查时,是否忽略直接连接。',`flow_check_time_out` int(11) DEFAULT '0' COMMENT '无流量检查超时时间,默认100s',`hcheck_online_interval` int(11) NOT NULL DEFAULT '0' COMMENT 'mainstay服务健康检查与上线间隔,默认0,不超过120s',`publish_interval` int(11) NOT NULL COMMENT '发布间隔时间',`publish_instance` int(11) NOT NULL COMMENT '发布实例数',`old_version` varchar(255) DEFAULT NULL COMMENT '发布前的版本',`new_version` varchar(255) DEFAULT NULL COMMENT '发布后版本',`offline_or_not` tinyint(1) NOT NULL COMMENT '是否下线',`online_or_not` tinyint(1) NOT NULL COMMENT '是否上线',`retry_time` int(11) NOT NULL COMMENT '重试次数',`publish_time_out` int(11) NOT NULL COMMENT '发布超时时间',`publish_reasons` varchar(1023) NOT NULL COMMENT '发布原因',`creator_name` varchar(255) NOT NULL COMMENT '创建者名字',`create_at` datetime DEFAULT NULL COMMENT '创建时间',`update_at` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8mb4;
h2-data.sql

插入基本数据,用来做测试的数据

insert into `cmdb_docker`.`tb_publish_list` ( `name`, `project_name`, `environment`, `status`, `image`, `type`, `titan_id`, `git_commit_id`, `superior`, `is_health_check`, `is_gated_launch`, `is_traffic_publish`, `ignore_direct_connection`, `flow_check_time_out`, `hcheck_online_interval`, `publish_interval`, `publish_instance`, `old_version`, `new_version`, `offline_or_not`, `online_or_not`, `retry_time`, `publish_time_out`, `publish_reasons`, `creator_name`, `create_at`, `update_at`) values ( 'titan-publish', 'api-manager-backend-h2', 'uat', 'publish_success', 'harbor.uat.ximalaya.com/uat/api-manager-backend:20200414-051829', 'standard', '29497', 'd2844a646806e737bb2317e3451f454ed64b9a5d', 'manual', '1', '1', '0', '1', '100', '0', '0', '1', 'api-manager-backend-20200414-86', 'api-manager-backend-20200414-87', '1', '1', '5', '300', '1.qwe;\n', 'lulce.song', '2020-04-14 17:19:25', '2020-04-14 17:27:07');
insert into `cmdb_docker`.`tb_publish_list` ( `name`, `project_name`, `environment`, `status`, `image`, `type`, `titan_id`, `git_commit_id`, `superior`, `is_health_check`, `is_gated_launch`, `is_traffic_publish`, `ignore_direct_connection`, `flow_check_time_out`, `hcheck_online_interval`, `publish_interval`, `publish_instance`, `old_version`, `new_version`, `offline_or_not`, `online_or_not`, `retry_time`, `publish_time_out`, `publish_reasons`, `creator_name`, `create_at`, `update_at`) values ( 'titan-publish', 'api-manager-backend-h2', 'uat', 'publish_success', 'harbor.uat.ximalaya.com/uat/api-manager-backend:20200414-052801', 'standard', '29498', 'd2844a646806e737bb2317e3451f454ed64b9a5d', 'manual', '1', '1', '0', '1', '100', '0', '0', '1', 'api-manager-backend-20200414-87', 'api-manager-backend-20200414-88', '1', '1', '5', '300', '1.qwe;\n', 'lulce.song', '2020-04-14 17:29:32', '2020-04-14 18:28:12');

第三步,创建内嵌的h2数据库

并且设置好DDL和DML的脚本文件

<!--当然是配置datasource了--><jdbc:embedded-database id="dataSource" type="H2"><!--一定要是先DDL,即数据库定义语言--><jdbc:script location="classpath:h2/h2-schema.sql"/><!--然后才是DML,数据库操作语言--><jdbc:script location="classpath:h2/h2-data.sql" encoding="UTF-8"/></jdbc:embedded-database>

第四步,修改业务的datasource指向这个embedded-database.

    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:sqlmap-config.xml" /><property name="dataSource" ref="dataSource" /></bean><bean id="sqlMap" class="org.springframework.orm.ibatis.SqlMapClientTemplate"><property name="sqlMapClient" ref="sqlMapClient" /></bean><!--当然是配置datasource了--><jdbc:embedded-database id="dataSource" type="H2"><!--一定要是先DDL,即数据库定义语言--><jdbc:script location="classpath:h2/h2-schema.sql"/><!--然后才是DML,数据库操作语言--><jdbc:script location="classpath:h2/h2-data.sql" encoding="UTF-8"/></jdbc:embedded-database>

第五步,正常开始执行单元测试就可以了。

写在最后

有什么看不懂的问题可以留言,我在看到评论后会做相应的解释和回答。

Spring项目使用H2内存数据库做单元测试相关推荐

  1. 在Spring Boot使用H2内存数据库

    文章目录 添加依赖配置 数据库配置 添加初始数据 访问H2数据库 在Spring Boot使用H2内存数据库 在之前的文章中我们有提到在Spring Boot中使用H2内存数据库方便开发和测试.本文我 ...

  2. Spring Boot整合H2内存数据库配置及常见问题处理

    文章目录 H2 数据库简介 内存数据库配置与控制台连接 在内存中创建表以及插入数据 SpringBoot整合H2内存数据查询 常见问题及解决 问题1: Database "mem:XXX&q ...

  3. SpringBoot使用H2内存数据库单元测试的代码示例

    一.背景 单元测试是提高代码质量和保证代码正确性的重要保证. DAO的单元测试有常见的两种方案. [1]使用H2这类内存数据库进行单元测试. [2]使用MySQL数据库,测试后回滚. 两种方案各有利弊 ...

  4. springboot整合H2内存数据库,实现单元测试与数据库无关性

    springboot整合H2内存数据库,实现单元测试与数据库无关性 一.新建spring boot工程 新建工程的时候,需要加入JPA,H2依赖 二.工程结构 pom文件依赖如下: [html] vi ...

  5. Spring Boot + BeetlSQL + H2数据库项目整合

    Spring Boot + BeetlSQL + H2数据库项目整合 这个项目是一个大佬给的,目的是看我的自学能力和基础知识的牢固程度,要求如下: 底层架构采用springboot 前端技术使用lay ...

  6. html如何与py_Web项目如何做单元测试?

    你可能会用单元测试框架,python的unittest.pytest,Java的Junit.testNG等. 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x ...

  7. 【报错笔记】在eclipse中做Spring项目时,创建Spring容器时老是出错

    在eclipse中做Spring项目时,创建Spring容器时老是出错 写完这句代码无法导包,最后发现包导错了,我原来导的4.3.9的包,而且是后缀为其他的包,而且对JDK也有要求,我又下载了5.0. ...

  8. 前端抢饭碗系列之Vue项目如何做单元测试

    大家好,我是若川.今天分享一篇vue项目如何做单元测试的好文,文章比较长,建议先收藏,需要时用电脑看. 点击下方卡片关注我.加个星标 学习源码系列.年度总结.JS基础系列 关于单元测试,最常见的问题应 ...

  9. Java单元测试实践-25.在本地使用H2数据库进行单元测试

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 使用 ...

最新文章

  1. ORACLE 几个我忍了他很多年的问题
  2. WebApi服务监控 log4net记录监控日志
  3. 数据分析---《Python for Data Analysis》学习笔记【04】
  4. 吃豆豆游戏的C语言程序码,C++实现基于控制台界面的吃豆子游戏
  5. ngCloak 实现 Angular 初始化闪烁最佳实践
  6. 辨别光纤收发器优劣的方法介绍
  7. 《黑客》月刊中文版第一期正式发布,很给力!推荐围观!
  8. ORACLE 查看有多个执行计划的SQL语句
  9. 【matlab】GPU 显卡版本与计算能力(compute capability)兼容性问题
  10. jboss java路径_JBOSS常用配置文件的路径 - liangy的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  11. html表单php比较三个值大小,php比较多维数组中值的大小排...-array_filter()函数去掉多维数组...-php生成静态html文件的三种方法_169IT.COM...
  12. MBE风格图标3步速学教程
  13. 【Python】使用python 画出一张机器猫doraemon
  14. python 日期 格式转换 英文_python中各种时间格式的转换
  15. 第1142期AI100_机器学习日报(2017-11-03)
  16. linux中把程序启到前台,Linux程序前台后台切换
  17. 萝卜小铺与商家的故事(一)
  18. 秒懂!什么是BI?热门BI工具?如何选择BI?
  19. TPM零知识学习九 —— tpm全安装流程复盘(上)
  20. COOX基础培训之DiagTool

热门文章

  1. 10步搞定App内测发布(蒲公英内测平台)
  2. js文字转图片,使用画布绘制
  3. 用友T3建立年度帐提示:对象名TAX_SB_NSSB_BJ_ZB无效
  4. Verilog语言之结构语句:if、case
  5. 学习python记录——第五天
  6. 蒙特卡洛算法及简单应用
  7. 好玩又赚钱的链游有哪些?
  8. 华为编程决赛后的感想
  9. 相思赋予谁 --知错
  10. 腾讯位置服务仿微信发送位置功能