2019独角兽企业重金招聘Python工程师标准>>>
单元测试与配置:
在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='临时文件表';
参考链接:
http://blog.csdn.net/isea533/article/details/50281151