小知识点系列-基于H2数据库单元测试

本文介绍了如何利用H2内存数据库进行单元测试,特别是在DAO层的测试。通过SpringBoot配置,设置H2数据源,并在启动时初始化数据库和表结构。使用schema.sql文件定义表结构,然后在测试类中进行功能测试,提高研发效率。
摘要由CSDN通过智能技术生成

引言

单元测试(Unit Test),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般情况下是一个方法或是一段逻辑,使用单元测试可以在不启动整体程序而进行局部逻辑和用例测试,提前在开发过程中发现问题,降低问题在生产环境发生的可能。 对于业务逻辑层一般情况下是通过mock外部的接口和DAO层的接口,而针对DAO层的逻辑多数情况要么不进行单元测试或是直接连接线下DB进行测试。如果线下数据库不稳定或是数据存在变化的情况下将会导致测试用例不能每次都跑通过,进而对研发效率造成影响,本文重点介绍通过内存数据库来实现轻量级别的DAO测试的技术方案。

1. 内存数据库是什么

内存数据库依赖于系统内存而不是磁盘数据存储空间。因为内存访问比磁盘访问快。当我们不需要持久化数据时,我们使用内存数据库。内存数据库是嵌入式数据库。默认情况下,内存数据库是易失性的,当我们重新启动应用程序时,所有存储的数据都会丢失。广泛使用的内存数据库是 H2数据库,基于内存数据库H2比较广泛的实践则为单元测试的持久层的解决方案

2. H2数据源初始化

通过SpringBoot配置类Configuration进行相关数据源初始化,与传统数据库DataSource一样,需要配置数据源相关的配置,相关参数参考如下,除此之外与普通数据源不同的在于需要增加一个内存数据库创建的Bean,用于在启动时生成H2数据库,对应的Bean为DataSourceInitializer。

@Configuration
public class H2DbConfig {

    @Bean
    public DataSource dataSource() {
        SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
        simpleDriverDataSource.setDriverClass(org.h2.Driver.class);
        simpleDriverDataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL");
        simpleDriverDataSource.setUsername("test");
        simpleDriverDataSource.setPassword("");
        DataSource dataSource = simpleDriverDataSource;
        return dataSource;
    }

    @Bean
    public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
        DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource);
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("h2/sql/schema.sql"));
        resourceDatabasePopulator.setContinueOnError(Boolean.TRUE);
        resourceDatabasePopulator.setIgnoreFailedDrops(Boolean.TRUE);
        initializer.setDatabasePopulator(resourceDatabasePopulator);
        return initializer;
    }
}

3. H2数据库结构定义

上面在定义H2数据库时指定了表结构的配置文件在ClassPath下的h2/sql/schema.sql下,通过schema我们定义我们DAO测试所需要的表结构,可以直接通过MySQL导出建表语句。

drop table if exists user;
create table user (
  id INT AUTO_INCREMENT  PRIMARY KEY,
  first_name VARCHAR(250) NOT NULL,
  last_name VARCHAR(250) NOT NULL,
  email VARCHAR(250) DEFAULT NULL
);

4. 基于SpringJUnit4ClassRunner进行功能测试

通过ContextConfiguration在启动时初始化H2数据源和ORM相关框架配置,然后进行

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MybatisDataSourceConfig.class,H2DbConfig.class })
public class DemoDaoTest {

    @Autowired
    private DemoDao demoDao;

	@Test
    public void testInsert() {
    	User user = new User();
    	user.setFirstName("aa")
    	demoDao.insert(user);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒲春伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值