h2数据库

使用h2数据库进行单元测试

一、下载h2数据库

官网:http://www.h2database.com/html/main.html
下载完成后解压,找到bin目录下的h2.bat打开h2数据库
添加参数jdbc:h2:~/test;AUTO_SERVER=TRUE
如下图:

输入用户名密码登入h2数据库
打开完成后,右下角工具栏会出现h2的图标

二、准备数据库文件

  1. 将之前的数据库导出为sql文件,使用数据传输功能导出为文件
  2. 将sql文件中有主外键关系的建表顺序修改合适,
  3. 文件头添加SET FOREIGN_KEY_CHECKS=0;来取消主外键的影响,(建表和插入)
  4. 删掉sql文件中的USING BTREE ,防止建表失败

三、项目中配置h2

  1. pom.xml中配置maven
    <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.4.200</version>
      <scope>test</scope>
    </dependency>
  1. 新建testresources
  2. 将sql文件放入testresouces文件夹中
  3. 新建.proterties配置文件,配置其中的内容 ,这里使用的是jdbc.properties
driver=org.h2.Driver
url=jdbc:h2:mem:default;MODE=MySQL;INIT=RUNSCRIPT FROM 'classpath:uolab817.sql'
username = root
password = root

注意 URL后面要加 jdbc:h2:~/test;AUTO_SERVER=TRUE AUTO_SERVER =TRUE
多个进程可以访问同一个数据库,而不必手动启动服务器。为此,添加.....。无论数据库是否已经打开,您都可以使用相同的数据库网址。

这里要说到一个单元测试时读取文件的机制:
先从单元测试的目录文件资源testresoueces去找数据库连接文件 否则会回去找resources目录下的数据库连接文件

四、配置junit5

  1. pom.xml中配置
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.5.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-runner</artifactId>
      <version>1.5.1</version>
    </dependency>
  1. 新建AllTest()测试类
@RunWith(JUnitPlatform.class)
@SelectPackages("com.ychs.dao")
@SelectClasses(
//选择之后会按照顺序来执行
        {CollegeMapperTest.class,
        MajorMapperTest.class,
        ClazzMapperTest.class,
        MemberMapperTest.class,
        }
public class AllTest {

}
  1. junit5断言时使用Assertions而不是Assert
  2. 注意junit5的导包:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

junit5提供了displayName来备注

h2数据库不支持MySql的一些语法:

// 不支持时间格式化format函数DATE_FORMAT(take_time,'%Y-%m') = #{takeTime},使用范围来代替
take_date &gt;'${takeDate}-01' AND take_date &lt;'${takeDate}-31'

如果连接数据库失败:

1.注释掉test
2.Maven的问题 打开repository文件夹 找到h2需要的jar包 在IDEA下面新建一个lib文件夹 将jar包粘贴 并在工程结构中重构。再执行
断言 不管插入多少条 永远是1 但如果用MySQL 不断向数据库插入信息,无法保证断言时存在的值是否为1
@before
@after 来恢复原始数据库内容
最后运行时要运行整个test类 实现执行完整个测试文件断言全部显示为1.

h2数据库在每次获得一个新的session时,都会删库,新建库,用h2数据库测试时不要关闭session

工具类应该如下:

package com.ychs.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.InputStream;

/**
 * copyright(c)2020 YCKJ.ALL rights Reserved
 * <p>
 * 描述: session 工具类
 *
 * @author caoning
 * @version 1.0
 * @date 2020.7.23
 */
public class Dbutil {
    private static Logger logger = LogManager.getLogger(Dbutil.class);
    static SqlSessionFactory sqlSessionFactory = null;
    private static SqlSession session = null;
    //静态初始化块,只执行一次
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            logger.error("初始化数据库连接失败", e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }

    public static SqlSession getSession() {
        if(session != null){
            return session;
        } else if (sqlSessionFactory != null) {
            session = sqlSessionFactory.openSession();
            return session;
        } else {
            return null;
        }
    }

}
posted @ 2020-08-17 22:55  玖捌贰陆  阅读(1161)  评论(0编辑  收藏  举报