java 单元测试 对h2数据库数据清理方式
短信预约 -IT技能 免费直播动态提醒
java 单元测试 对h2数据库数据清理
前因
写测试框架的时候使用的精简测试框架不需要启动整个springboot,并不支持@Transactional测试后回滚h2数据库,而是在基础测试类里声明cleandb函数供使用,这就需要适配任意表的数据清除,不过更推荐不清理,以方法名为id使数据不重复即可
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单元测试依赖。
<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
@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所模拟的数据库)
SET MODE Oracle;
INIT_TABLE.sql (单元测试需要的数据库表初始化)
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 (不需要特殊方法时,此不可忽略)
CREATE ALIAS TO_DATE FOR "com.mvn.task.one.Function.toDate";
INIT_DATA.sql (初始化测试数据)
INSERT INTO TEST(ID,PARAM1,PARAM2,PARAM3,PARAM4)
VALUES(100,'TEST1','TEST2','2','JKL');
至此H2部分准备完毕
下面来写个Junit4的单元测试类例子
@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单元测试完成,另外一个数据源单元测试重复以上步骤即可~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341