收尾工作
?
回想一下,我们的去O工作完成了么?还没有,我们还在单元测试的阶段。
这时候需要做2个工作:
1、找到开发线上的data-source.xml,更换成单元测试的“样子”类似下面的:
?
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"><value>com.mysql.jdbc.Driver</value></property> <property name="jdbcUrl"><value>${adminPortal_database_url}</value></property> <property name="properties"> <props> <prop key="user">${adminPortal_database_username}</prop> <prop key="password">${adminPortal_database_password}</prop> </props> </property> <property name="testConnectionOnCheckin" value="true" /> <property name="testConnectionOnCheckout" value="true" /> <property name="idleConnectionTestPeriod" value="60" /> </bean>
?
2、更改antx.properties里的配置项。(发布时需要SA帮忙把配置项更新成mysql的)
?
注:这里的antx.properties是一个属性文件,公司web框架的一个配置文件,用于初始化信息用的。每个公司可能不同,也有可能没有这个配置文件,而是写死在xml文件里的。
?
一些额外的注意点
?
1、建表语句
在PLSQL中我们导出表结构是这样的
create table AP_BANK ( ID NUMBER(12) not null, GMT_CREATE DATE default SYSDATE not null, GMT_MODIFIED DATE default SYSDATE not null, BANK_CODE VARCHAR2(64) not null, DISPLAY_NAME VARCHAR2(128) not null, DISABLE CHAR(1) default 'N' not null, PARTNER VARCHAR2(64) not null, BANK_TYPE VARCHAR2(32) default 'bank' not null ); comment on column AP_BANK.ID is '主键'; ……
?
?
在Navicat中导出的表结构是这样的
?
CREATE TABLE ap_bank ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', gmt_create datetime NOT NULL COMMENT '系统创建时间', gmt_modified datetime NOT NULL COMMENT '系统修改时间', bank_code varchar(64) NOT NULL COMMENT '银行编号', display_name varchar(128) NOT NULL COMMENT '显示名', disable char(1) NOT NULL DEFAULT 'N' COMMENT '是否可用', partner varchar(64) NOT NULL COMMENT '合作者', bank_type varchar(32) COMMENT '银行类型', PRIMARY KEY (id) ) ENGINE=InnoDB COMMENT='银行信息表';
?
?
这里的 ENGINE=InnoDB 是必须的。还可以在表注释前加上,AUTO_INCREMENT=162表示起始从162自增,DBA说不需要这样做。
小技巧:在shell命令行下用 show create table 表名; 可以查看当初的sql语句。
?
2、c3p0的配置
刚才说道还有3个配置项没有解释为什么要加,因为在测试的时候发现一个问题,就是如果页面长时间无操作,且没session超时。但此时很可能数据库连接断开了,虽然我们配置了重连选项,但依旧会报错。百度了一下,加上这三个配置<property name="testConnectionOnCheckin" value="true" /><property name="testConnectionOnCheckout" value="true" /><property name="idleConnectionTestPeriod" value="60" />
就OK了。
异常说明:Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost
百度了一下,有个人也遇见了这个异常,解决方法就是添加这三个配置项
?
3、关于org.springframework.test.AbstractTransactionalDataSourceSpringContextTests的单元测试。
还记得建表时的ENGINE=InnoDB么?当我们使用spring的单元测试时,我们如果没有指定引擎会导致事务无法回滚。
引用iteye里的答案:
“没有指定表的引擎. 而Mysql5.x在linux下的默认引擎是MyISAM, 而不是期望的InnoDB, 所以建立数据库表时如果没有指定引擎, 那么表的引擎MyISAM, 从而导致不支持事务. 解决办法是把所有的表的引擎改为InnoDB后, 事务正常回滚了.”
?
4、关于利用sql脚本来批量初始化数据库
有一些web程序,在做biz层的单元测试时,会利用一个统一的sql脚本来批量初始化数据,来达到避免在单元测试中赘述DAO的insert语句。
在你的初始化sql脚本中,注意不要将ID设置成0,否则每一次执行单元测试时,都会向表中插入一条数据。而在mysql的命令行下,即使设置id为0也不会影响对数据库的插入动作。