好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java 单元测试 对h2数据库数据清理方式

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

查看更多关于java 单元测试 对h2数据库数据清理方式的详细内容...

  阅读:37次