文章目录
摘要
利用h2内存数据库编写Dao层的单元测试用例,代码以pg为例,mysql也是同样适用的。
一、背景
单元测试时提升代码质量和保证代码正确性的重要保证,而在写DAO层的单元测试时,我们往往会遇到一个问题,测试用例所依赖的数据库数据被修改或修改,或者在一个新的环境下所依赖的数据库不存在,导致单元测试无法通过,进而构建失败。
二、技术选型
DAO的单元测试有常见的两种方案:
- 使用H2这类内存数据库进行单元测试
- 使用真实的数据库类型,如Mysql/Postgres, 测试用例执行后回滚。
两种方案各有利弊,个人更加倾向于使用第一种,因为更加高效和解耦。
三、流程图
确定好技术方案之后就是落地的流程了,我这里花了一张图
四、步骤
4.1 引入依赖库
pom文件中添加
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
4.2 配置spring参数
定义一个配置文件:application-testPg.yml
spring:
#初始化基本的配置项
datasource:
url: jdbc:h2:mem:learn_db;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
# url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
username: root
password:
driver-class-name: org.h2.Driver
sql:
#启动时需要初始化的建表语句
init:
username: root
password:
platform: pg
schema-locations: classpath:sql/init/createDB-{{platform}}.sql
# mode: always # 如果启动springboot要执行记得开启always, 关闭下面的never
mode: always
separator: ;
data-locations: classpath:sql/init/h2/data-{{platform}}.sql
4.3 数据库初始化sql
CREATE TABLE IF NOT EXISTS t_persons
(
Id_P varchar(255) NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
);
COMMENT on table t_persons is 'The persons table';
还有数据初始化的sql
INSERT INTO t_persons (Id_P, LastName, FirstName, Address, City) VALUES ('1', 'h', 'jk', 'china', 'dongguan');
4.4 公共的入口配置类编写
package com.dreamkite.pg;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Profile;
@SpringBootTest(classes={UsePgApplication.class})
@Profile(value="testPg")
public class TestPgDao {
}
4.5 测试用例编写
package com.dreamkite.pg.service;
import com.dreamkite.pg.TestPgDao;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
class PersonServiceTest extends TestPgDao {
@Autowired
PersonService personService;
@Test
void delete() {
System.out.println(personService.queryPersonById("1"));
personService.delete("1");
System.out.println(personService.queryPersonById("1"));
personService.insert("1", "h", "jk", "china", "dongguan");
System.out.println(personService.queryPersonById("1"));
}
}
4.6 测试效果
一开始就有数据说明h2的数据初始化成功,后面删除和新增都能起到效果,说明h2内存数据替代pg进行测试用例的操作成功~~
五 代码链接:
虽然有上面的代码和截图,不过代码的结构等等原因都可能会影响到最终的效果实现,所以最根本还是分享一波经过验证过的代码给大家,欢迎大家点赞关注~~
查看代码请戳 → 戳我
六、参考链接:
(以上内容为DreamKite本人原创,转载请附上原文链接)