-
为什么要使用H2数据库:
- 在写DAO层的单元测试时,我们往往会遇到一个问题,测试用例所依赖的数据库数据被修改或删除了,或者在一个新的环境下所依赖的数据库不存在,导致单元测试无法通过,进而构建失败。
- 在这种情况下,使用H2内存数据库来模拟数据库环境是一个很好的解决方案:这种数据库可以伴随着我们的单侧用例启动而启动,运行结束即关闭,对数据不会进行持久化的操作;
操作步骤:
1.引入pom.xml文件依赖
- </dependency>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <scope>test</scope>
-
2.配置JDBC.properties:
- jdbc.gaotu.url=jdbc:h2:mem:gaotu;MODE=MYSQL;DB_CLOSE_DELAY=-1
- jdbc:h2:mem: 表示使用的数据库是H2内存数据库;
- gaotu:表示数据库的命名;
- MODE=MYSQL 表示我们的数据库以mySql的形式运行
- DB_CLOSE_DELAY=-1 设置数据库延时关闭,给代码执行预留时间
- jdbc.gaotu.url=jdbc:h2:mem:gaotu;MODE=MYSQL;DB_CLOSE_DELAY=-1
-
3.写sql;(这里的sql用的是H2数据库的sql语句)
- schema.sql
- data.sql
-
4.数据源配置:
- 1)文件如下:
-
package com.gaotu.test.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.jdbc.datasource.init.DatabasePopulator; import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration @EnableTransactionManagement @PropertySource(ignoreResourceNotFound = true, value = { "classpath:jdbc.properties" }) @MapperScan(basePackages = { "com.gaotu.mapper", "com.jiazi.**.mapper","com.gaotu.**.mapper.auto" }, sqlSessionFactoryRef = "gaotuSessionFactory") public class GaotuDataSourceTestConfig { @Value("${jdbc.gaotu.username}") private String username; @Value("${jdbc.gaotu.password}") private String password; @Value("${jdbc.gaotu.url}") private String url; @Value("classpath:/db/gaotu/INIT_TABLE.sql") private Resource schemaScript; @Value("classpath:/db/gaotu/INIT_DATA.sql") private Resource dataScript; public DataSource gaotuDatasource() throws Exception { DriverManagerDataSource dataSource = new DriverManagerDataSource(url, username, password); return dataSource; } @Bean(name = "gaotuDatasource") public DataSource getDataSource() throws Exception { DataSource dataSource = gaotuDatasource(); DatabasePopulatorUtils.execute(databasePopulator(), dataSource); return dataSource; } @Bean(name = "gaotuSessionFactory") public SqlSessionFactory sqlSessionFactoryBean( @Autowired @Qualifier(value = "gaotuDatasource") final DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("db/mybatis-config.xml")); sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean.getObject(); } private DatabasePopulator databasePopulator() { final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.addScript(schemaScript); populator.addScript(dataScript); return populator; } @Bean(name = "gaotuTransactionManager") public PlatformTransactionManager gaotuTransactionManager( @Autowired @Qualifier(value = "gaotuDatasource") final DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
- 2)文件如下:
-
package com.gaotu.test.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource(value = {"classpath:application.properties"}) @ComponentScan(basePackages = { "com.gaotu.**.dao"}) public class DaoBasicTestConfig { }
-
-
- 1)文件如下:
- 5.写单侧实例:
- 1)BaseDaoTest.java
-
package com.gaotu.test.base; import com.gaotu.test.config.DaoBasicTestConfig; import com.gaotu.test.config.GaotuDataSourceTestConfig; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { DaoBasicTestConfig.class, GaotuDataSourceTestConfig.class}) public class BaseDaoTest {}
- 2)具体的单侧
-
package com.gaotu.order.dao.test; import com.gaotu.mapper.auto.OrderInfo; import com.gaotu.order.dao.OrderInfoDAO; import com.gaotu.test.base.BaseDaoTest; import org.junit.Assert; import org.junit.Test; import javax.annotation.Resource; public class OrderInfoDAOTest extends BaseDaoTest { @Resource private OrderInfoDAO orderInfoDAO; @Test public void testGetOrderInfoByOrderId() { final OrderInfo orderInfo = orderInfoDAO.getOrderInfoByOrderId("251996234968758"); Assert.assertNotNull(orderInfo); Assert.assertEquals(251996234968758L, orderInfo.getOrderNumber().longValue()); } }
-
-
- 1)BaseDaoTest.java