前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot使用H2内存数据库单元测试的代码示例

SpringBoot使用H2内存数据库单元测试的代码示例

作者头像
明明如月学长
发布2021-08-31 14:56:47
3.4K0
发布2021-08-31 14:56:47
举报
文章被收录于专栏:明明如月的技术专栏

一、背景

单元测试是提高代码质量和保证代码正确性的重要保证。

DAO的单元测试有常见的两种方案。

【1】使用H2这类内存数据库进行单元测试。

【2】使用MySQL数据库,测试后回滚。

两种方案各有利弊,个人倾向于前者。

网上有很多示例,都是很多案例没有给出可运行的项目源码,搭建过程中会遇到很多坑,本文文末会给出可运行源码,方便大家改造学习。

二、利弊对比

下面是自己的个人观点,仅供参考。

2.1 使用H2这类内存数据库进行单元测试

官网地址:http://www.h2database.com/html/main.html

github地址:https://github.com/h2database/h2database

使用H2内存数据库来单元测试的优势在于

  • h2更快速,且支持JDBC API。
  • 支持内嵌和服务器模式;是一种内存的数据库
  • 支持浏览器控制台
  • jar包比较小

另外

  • 如果使用公共的开发数据库,服务器如果回收再测试就需要继续安装建表和插入数据。
  • 如果每个人都本地测试,为了测试都要安装MySQL或Oracle等数据库并手动执行建表和插入。

当然也有一些劣势,虽然可以支持多种数据库模式,但是特殊的语句可能会不支持。

个人更倾向于推荐这种内存数据库进行DAO层单测的方式。

2.2 使用MySQL测试后回滚

使用MySQL测试后回滚是常见的一种方式,最大的问题如果是自己本地测试,其他人如果想测试需要再创建表和插入数据,非常麻烦。

即使公用同一个开发服务器,如果同时修改同一个表也容易相互影响。

使用开发服务器,如果开发服务器需要内网才可连接,回去就不方便。

使用H2数据库就不容易相互影响。

三、编码

首先看项目结构

本示例非常简单,提供了一个UserInfo实体,建表语句放在schema.sql中,data.sql插入几条记录。

application配置文件不同环境之间是隔离的,我们这个示例项目,测试时设置为test环境。

application-test.properties 文件

代码语言:javascript
复制
spring.application.name=h2-test-demo
# 数据库配置
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.schema=schema.sql
spring.datasource.data=data.sql

#mybatis配置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath*:mybatis/mappers/*.xml
代码语言:javascript
复制
Application类
代码语言:javascript
复制
@SpringBootApplication
@MapperScan("h2demo.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

单元测试基类

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@ActiveProfiles(value="test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class BaseMapperTest {
}

使用非常简单,只要继承该基类即可。

代码语言:javascript
复制
public class UserInfoMapperTest extends BaseMapperTest {

    @Resource
    private UserInfoMapper userInfoMapper;

    @Test
    public void deleteById() {
        int rows = userInfoMapper.deleteById(1L);
        Assertions.assertThat(rows).isGreaterThan(0);
    }
}

项目的pom.xml文件

代码语言:javascript
复制
    4.0.0

    com.chujianyun
    h2-unit-test-demo
    1.0-SNAPSHOT

    

    
    
        
        
            org.springframework.boot
            spring-boot-starter-web
            2.1.7.RELEASE
        


        
        
            org.springframework.boot
            spring-boot-starter-test
            2.1.7.RELEASE
            test
        


        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.1.0
        

        
        
            com.h2database
            h2
            1.4.199
            test
        

        
        
            junit
            junit
            4.12
            test
        

        
        
            org.projectlombok
            lombok
            1.18.8
            provided
        

    

   
        
            
                
                    org.apache.maven.plugins
                    maven-surefire-plugin
                    ${maven-surefire-plugin.version}
                
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
                
                    maven-clean-plugin
                    3.0.0
                
                
                
                    maven-resources-plugin
                    3.0.2
                
                
                    maven-compiler-plugin
                    3.7.0
                
                
                    maven-surefire-plugin
                    2.20.1
                
                
                    maven-jar-plugin
                    3.0.2
                
                
                    maven-install-plugin
                    2.5.2
                
                
                    maven-deploy-plugin
                    2.8.2
                
                
                
                    maven-compiler-plugin
                    2.3.2
                    
                        1.8
                        1.8
                        UTF-8
                        
                            ${project.basedir}/src/main/resources/lib

项目的地址:git@github.com:chujianyun/springboot-h2-test-demo.git

四、Learn More

4.1 调试

可以在插入语句处断点,然后单步进入源码查看整个执行流程,注意观察参数。

注意观察左下角的调用栈,通过调用栈切换代码层次来学习源码。

4.2 源码

可以通过配置文件

点击数据源配置下面几项,可以跳转到spring-boot-autoconfigure.jar中查看参数对应的自动配置的类。

点击mybatis配置下面几项,可以跳转到mybatis-spring-boot-autoconfigure.jar中查看对应的配置类和处理代码。

大家还可以进入h2的驱动jar包和mybatis的jar中查看源码的逻辑。

通过这些可以学到更多内容。

五、总结

本文主要讲述SpringBoot使用H2内存数据库进行单元测试的案例。

在此也提倡大家对DAO层采用内存数据库的方式进行单元测试。

对于Service层的测试建议使用mockito,通过mock依赖的其他服务来检测当前模块逻辑是否正确的方式进行测试。

最后讲述通过调试和读源码来学到更多细节。

总之建议大家一定要重视单元测试,尽可能地避免失误,通过单元测试提高编码的质量,另外学习不要止步与实现功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、利弊对比
    • 2.1 使用H2这类内存数据库进行单元测试
    • 2.2 使用MySQL测试后回滚
    • 三、编码
    • 四、Learn More
      • 4.1 调试
        • 4.2 源码
        • 五、总结
        相关产品与服务
        云数据库 SQL Server
        腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档