dao層的單元測試不能依賴測試環境的數據庫以避免環境的影響,H2是一個內存數據庫,支持標准SQL,相當於把數據庫本地化,可以避免對測試環境的依賴,也可以提升單測的速度
SpringBoot與H2的整合
由於springBoot提供了H2的默認配置,如果使用是的springBoot則不需要新增h2的配置。默認配置如下:
提示:如果不是基於SpringBoot的測試,則需要加上這幾項配置
H2數據庫初始化
由於h2是內存數據庫,不能保存表結構,在每次測試環境准備的時候都要先初始化好需要用到的表結構。
我們在在test/resources目錄下新建一個schema.sql文件,這個文件將在初始化數據源的時候被引用到。建表語句如下:
CREATE TABLE `User` (
`AutoId` bigint(20) NOT NULL AUTO_INCREMENT,
`UserId` bigint(20) NOT NULL COMMENT '用戶Id',
`UserName` varchar(64) NOT NULL COMMENT '用戶姓名',
`Age` int(10) NOT NULL COMMENT '年齡',
`PointValue` int(11) NOT NULL DEFAULT '0' COMMENT '積分',
`Status` smallint(6) NOT NULL DEFAULT '0' COMMENT '記錄可用狀態',
`CreateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記錄創建日期',
`LastModifyTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改日期',
PRIMARY KEY (`AutoId`)
);
建表語句后面不能有ENGINE=InnoDB DEFAULT CHARSET=utf8,不然將會報錯。
下面是初始化數據源的代碼:
@Bean
public DataSource h2DataSource(){
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase database = builder.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql") ///啟動時初始化建表語句
.build();
return database;
}
H2的pom依賴
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.195</version>
<scope>test</scope>
</dependency>
至此,H2的初始化完成,構建了一個基於H2的本地內存數據庫,這樣我們就實現了單元測試與測試環境數據庫的解耦,零依賴。
更多內容歡迎關注個人微信公眾號,一起成長!