使用h2数据库进行单元测试
一、下载h2数据库
官网:http://www.h2database.com/html/main.html
下载完成后解压,找到bin目录下的h2.bat打开h2数据库
添加参数jdbc:h2:~/test;AUTO_SERVER=TRUE
如下图:
输入用户名密码登入h2数据库
打开完成后,右下角工具栏会出现h2的图标
二、准备数据库文件
- 将之前的数据库导出为sql文件,使用数据传输功能导出为文件
- 将sql文件中有主外键关系的建表顺序修改合适,
- 文件头添加SET FOREIGN_KEY_CHECKS=0;来取消主外键的影响,(建表和插入)
- 删掉sql文件中的USING BTREE ,防止建表失败
三、项目中配置h2
- 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>
- 新建testresources
- 将sql文件放入testresouces文件夹中
- 新建.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
- 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>
- 新建AllTest()测试类
@RunWith(JUnitPlatform.class)
@SelectPackages("com.ychs.dao")
@SelectClasses(
//选择之后会按照顺序来执行
{CollegeMapperTest.class,
MajorMapperTest.class,
ClazzMapperTest.class,
MemberMapperTest.class,
}
public class AllTest {
}
- junit5断言时使用Assertions而不是Assert
- 注意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 >'${takeDate}-01' AND take_date <'${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;
}
}
}