junit mysql脚本,MyBatis的JUnit测试

背景

最近项目中遇到一个场景,需要将项目中原有的DB切成MySQL。为了验证修改后的MyBatis的XML映射文件的SQL语法是否OK,重新部署后,在界面上一顿狂点。这种做法太Low,不仅没效率,还可能存在漏测。

目的

通过MyBatis自带的API,实现XML映射文件的加载,达到在本地测试的目的。无需启动spring框架服务,灵活配置本地调试场景。

实现方案

1. 数据库连接属性配置

配置数据库驱动、用户名、密码等属性,写入db-config.properties文件中,如:

mysql.driver=com.mysql.cj.jdbc.Driver

mysql.url=jdbc:mysql://localhost:3306/qiyin?useUnicode=true&characterEncoding=utf8

mysql.username=root

mysql.password=123456

复制代码

2. MyBatis配置文件

MyBatis配置文件的各个字段,在官网有详细介绍【传送门】 。

如下是我的配置文件mybatis-config.xml:

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

复制代码

值得注意的有一下几点:

properties字段的resource指向在上一节定义好的数据库连接属性文件的路径。

environment节点可以定义多个,其包含的dataSource节点中的属性值引用来自于db-config.properties定义的变量。

mapper节点可以有几种不同实现方式,详细可查看官方文档【传送门】。但如果配置不当,会报XXX is not known to the MapperRegistry或者是抛出BindingException异常。最终我采用了

方式,虽然每个XML映射文件都需要手动声明一次,但胜在不易出错。如果有更nice的方法,请在回复中不吝赐教。

3. MyBatis创建Session工具类

上面两步骤完成了一些必要的配置,接下来,就需要使用一个工具类来代替spring来实现数据库会话创建、Mapper类加载等操作。直接上代码:

public class MybatisUtil{

private static final LogUtil log = LogUtil.getLogger(MybatisUtil.class, MybatisUtil.class.getSimpleName());

/**

* MyBatis配置文件路径

*/

private static final String MYBATIS_CONFIG_PATH = "mybatis-config.xml";

private static SqlSessionFactory factory;

private static ThreadLocal localSessions = new ThreadLocal<>();

/**

* 加载并解析配置文件

*/

static {

try(

InputStream in = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH)

) {

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

factory = builder.build(in);

} catch (IOException e) {

log.error("SqlSessionFactory init error", e);

}

}

/**

* 常见会话

* @return

*/

public static SqlSession getSession(){

SqlSession sqlSession = localSessions.get();

if (sqlSession == null){

sqlSession = factory.openSession();

localSessions.set(sqlSession);

}

if (sqlSession == null){

log.error("#getSession error, session is nulll");

} else {

log.info("#getSession successfully");

}

return sqlSession;

}

/**

* 销毁会话

*/

public static void closeSession(){

SqlSession sqlSession = localSessions.get();

if (sqlSession != null){

sqlSession.close();

localSessions.remove();

}

log.info("#closeSession successfully");

}

}

复制代码

4. 测试验证材料

在项目的resources目录中,已经有一个MyBatis的XML映射文件:mybatisMapper/ProjectMapper.xml。模拟一个select方法selectProjectsByUserName

SELECT

FROM todo_project

where created_user_name = #{userName}

order by last_time desc

LIMIT 1000

复制代码

对应的接口类为:ProjectDao

public interface ProjectDao{

List selectProjectsByUserName(@Param("userName") String userName);

}

复制代码

5. JUnit测试脚本

public class ProjectDaoTest{

private static final LogUtil log = LogUtil.getLogger(ProjectDaoTest.class, ProjectDaoTest.class.getSimpleName());

private SqlSession sqlSession;

private ProjectDao projectDao;

@Before

public void setUp() throws Exception{

log.info("#setUp start...");

sqlSession = MybatisUtil.getSession();

projectDao = sqlSession.getMapper(ProjectDao.class);

}

@Test

public void testSelectProjectsByUserName(){

List projects = projectDao.selectProjectsByUserName("admin");

Assert.assertTrue(CollectionUtils.isNotEmpty(projects));

}

@After

public void tearDown() throws Exception{

log.info("#tearDown start...");

sqlSession.commit();

MybatisUtil.closeSession();

}

}

复制代码

测试脚本的关键在于,使用SqlSession实例的getMapper()方法加载已经注册的Mapper对象。

所谓的已经注册是指在解析MyBatis配置文件时,通过加载MyBatis配置文件中的mappers节点的信息,调用MapperRegistry实例的addMappers方法来完成注册。

备注

项目中一般都会存在多个MyBatis的XML映射文件,此时需要在mybatis-config.xml文件的mappers节点中添加新的映射关系。然后可以考虑,在测试包目录下,新建一个类似ProjectDaoTest的测试类。在这个类中,可以测试XML映射文件中涉及的每个sql方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值