java 单元测试 对h2数据库数据清理
前因
写测试框架的时候使用的精简测试框架不需要启动整个springboot,并不支持@Transactional测试后回滚h2数据库,而是在基础测试类里声明cleandb函数供使用,这就需要适配任意表的数据清除,不过更推荐不清理,以方法名为id使数据不重复即可
1
2
3
4
5
6
7
8
9
10
11
12
13
|
try { JdbcTemplate jdbcTemplate = 获取DataSource结构,反射或加载Bean等都可以,不要对业务代码侵入; Connection connection = jdbcTemplate.getDataSource().getConnection(); //获取连接 ResultSet tables = connection.getMetaData().getTables( null , null , null , new String[]{ "TABLE" }); //获取表名 connection.close(); //记得关闭连接,或者使用连接池 while (tables.next()){ //若是测试类的测试方法超过7,java.sql.Connection无法获取连接导致死循环 jdbcTemplate.update( "DELETE FROM " + tables.getObject( "TABLE_NAME" )); //spring-test-5.2.1.RELEASE-sources.jar!\org\springframework\test\jdbc\JdbcTestUtils.deleteFromTables如果使用了springtest可以代替使用该方法 } } catch (SQLException e) { e.printStackTrace(); } |
junit单元测试使用H2内存数据库
首先导入H2内存数据库
Junit4单元测试依赖。
1
2
3
4
5
6
7
8
9
10
11
12
|
< dependency > < groupId >com.h2database</ groupId > < artifactId >h2</ artifactId > < version >1.4.185</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.11</ version > < scope >test</ scope > </dependency |
其次使用H2数据源模拟Oracle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Component @Profile ( "testOne" ) // 指定单元测试活动所匹配的数据源 public class DataSourceConfig4Test { @Bean (name= "dataSourceUtils" ) // 要和模拟的数据源名称相对应 DataSource dataSourceUtils() throws SQLException { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript( "classpath:/H2_TYPE.sql" ) .addScript( "classpath:/INIT_TABLE.sql" ) .addScript( "classpath:/H2_FUNCTION.sql" ) .addScript( "classpath:/INIT_DATA.sql" ) .build(); } } |
H2_TYPE.sql (设置H2所模拟的数据库)
1
|
SET MODE Oracle; |
INIT_TABLE.sql (单元测试需要的数据库表初始化)
1
2
3
4
5
6
7
8
|
CREATE TABLE TEST ( ID NUMBER(38,0) PRIMARY KEY NOT NULL , PARAM1 VARCHAR2(6) NOT NULL , PARAM2 VARCHAR2(6) NOT NULL , PARAM3 VARCHAR2(1) NOT NULL , PARAM4 VARCHAR2(50) NOT NULL ); |
H2_FUNCTION.sql (不需要特殊方法时,此不可忽略)
1
|
CREATE ALIAS TO_DATE FOR "com.mvn.task.one.Function.toDate" ; |
INIT_DATA.sql (初始化测试数据)
1
2
|
INSERT INTO TEST(ID,PARAM1,PARAM2,PARAM3,PARAM4) VALUES (100, 'TEST1' , 'TEST2' , '2' , 'JKL' ); |
至此H2部分准备完毕
下面来写个Junit4的单元测试类例子
1
2
3
4
5
6
7
8
9
10
11
12
|
@ActiveProfiles ( "testOne" ) // 需要和H2模拟的数据源对应上 @RunWith (SpringJUnit4ClassRunner. class ) @ContextConfiguration (locations = "classpath:testspring/applicationContext-test-one.xml" ) public class oneTest { @Autowired private ITestService iTestService; @Test public void testBengin(){ Test model = iSubcService.findTest( "TEST1" , "TEST2" ); Assert.assertNotNull(model); } } |
到此H2和Junit单元测试完成,另外一个数据源单元测试重复以上步骤即可~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_34146694/article/details/109286436