单元测试与配置:
在springboot中为什么可以用内存数据库h2代替真实数据库进行单元测试?
这是因为,Spring Boot 支持多种外部配置方式,其中application-{profile}.properties和application.properties的优先级如下:
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
因此,我们在application-{profile}.properties中配置h2数据库,则单元测试的时候,可以指向优先调用h2数据库的数据。以下为application-{profile}.properties中的h2数据库配置:
#datasource
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:h2:mem:/**数据库名**/;MVCC=FALSE
spring.datasource.username=/**用户名**/
spring.datasource.password=/**密码**/
spring.datasource.driver-class-name=org.h2.Driver
以下为application.properties中的数据库配置:
#datasource
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///**数据库IP:端口**///**数据库名**/?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=TRUE
spring.datasource.username=/**用户名**/
spring.datasource.password=/**密码**/
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
单元测试与唯一键索引:
某次,博主在新建h2数据库之后,进行单元测试的过程中,发现报错如下:
Caused by: org.h2.jdbc.JdbcSQLException: Constraint "FID" already exists;
但是博主找不出在h2库中建的表有什么问题,后来在同事的帮助下,找到了原因:原来h2数据库的建表规则与普通mysql数据库不一样,建表的唯一键索引名称不能一样,否则报唯一键索引重复:
-- ----------------------------
-- Table structure for `bill_import_info`
-- ----------------------------
CREATE TABLE `bill_import_info` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(20) NOT NULL COMMENT '文件id',
`parent_id` int(20) NOT NULL DEFAULT '0' COMMENT '父文件id',
`file_name` varchar(20) NOT NULL DEFAULT '' COMMENT '文件名称',
`md5_code` varchar(32) NOT NULL DEFAULT '' COMMENT 'MD5字段串',
`status` char(2) NOT NULL DEFAULT '' COMMENT '文件转换状态(Y:成功,N:失败,P:正在执行)',
`file_size` varchar(20) NOT NULL DEFAULT '' COMMENT '文件大小',
`file_type` varchar(20) NOT NULL DEFAULT '' COMMENT '文件类型',
`created_by` varchar(20) NOT NULL DEFAULT '' COMMENT '创建人',
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`tid`),
UNIQUE KEY `fid` (`fid`)
)
COMMENT='文件导入表'
AUTO_INCREMENT=76
;
-- ----------------------------
-- Table structure for `reconciliation_temporary_info`
-- ----------------------------
CREATE TABLE `reconciliation_temporary_info` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`fid` bigint(20) NOT NULL COMMENT '文件id',
`file_name` varchar(100) NOT NULL DEFAULT '' COMMENT '文件名称',
`file_path` varchar(300) NOT NULL DEFAULT '' COMMENT '文件路径',
`file_size` varchar(20) NOT NULL DEFAULT '' COMMENT '文件大小',
`status` char(2) NOT NULL DEFAULT '' COMMENT '导出状态(Y:成功,N:失败)',
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '生成时间',
`file_account_period` varchar(20) NOT NULL DEFAULT '' COMMENT '文件账期标识',
`bill_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '文件账期',
`customer_name` varchar(100) NOT NULL DEFAULT '' COMMENT '客户名称',
PRIMARY KEY (`tid`),
UNIQUE KEY `fid` (`fid`)
)
COMMENT='临时文件表'
;
将两个表的唯一键名称改不一样之后,就可以了:
-- ----------------------------
-- Table structure for `bill_import_info`
-- ----------------------------
CREATE TABLE `bill_import_info` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(20) NOT NULL COMMENT '文件id',
`parent_id` int(20) NOT NULL DEFAULT '0' COMMENT '父文件id',
`file_name` varchar(20) NOT NULL DEFAULT '' COMMENT '文件名称',
`md5_code` varchar(32) NOT NULL DEFAULT '' COMMENT 'MD5字段串',
`status` char(2) NOT NULL DEFAULT '' COMMENT '文件转换状态(Y:成功,N:失败,P:正在执行)',
`file_size` varchar(20) NOT NULL DEFAULT '' COMMENT '文件大小',
`file_type` varchar(20) NOT NULL DEFAULT '' COMMENT '文件类型',
`created_by` varchar(20) NOT NULL DEFAULT '' COMMENT '创建人',
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`tid`),
UNIQUE KEY `idx_bii_fid` (`fid`)
)
COMMENT='文件导入表'
AUTO_INCREMENT=76
;
-- ----------------------------
-- Table structure for `reconciliation_temporary_info`
-- ----------------------------
CREATE TABLE `reconciliation_temporary_info` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`fid` bigint(20) NOT NULL COMMENT '文件id',
`file_name` varchar(100) NOT NULL DEFAULT '' COMMENT '文件名称',
`file_path` varchar(300) NOT NULL DEFAULT '' COMMENT '文件路径',
`file_size` varchar(20) NOT NULL DEFAULT '' COMMENT '文件大小',
`status` char(2) NOT NULL DEFAULT '' COMMENT '导出状态(Y:成功,N:失败)',
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '生成时间',
`file_account_period` varchar(20) NOT NULL DEFAULT '' COMMENT '文件账期标识',
`bill_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '文件账期',
`customer_name` varchar(100) NOT NULL DEFAULT '' COMMENT '客户名称',
PRIMARY KEY (`tid`),
UNIQUE KEY `idx_rti_fid` (`fid`)
)
COMMENT='临时文件表'
;
参考链接: