MyBatis测试用例

MyBatis 作为一个已开发多年并且拥有大量用户的开源项目,提供了详尽的测试用例。几乎所有功能和代码都有对应的测试,MyBatis 测试用例的包名和源码基本对应,在阅读源码的同时还可以通过测试用例更直观地了解类的作用或用法。MyBatis 的大量测试用例也是我们学习某些功能的最佳帮助文档,许多在文档中看不到的内容,都可以从测试用例中学习。

这一节的重点在于如何通过测试用例学会使用 MyBatis 的各项功能,主要的关注点在 org.apache.ibatis.submitted 包中。这个包中包含了大量的功能性测试,常用的和不常用的功能都全面覆盖,当需要搜索到某些功能的用法时,可以浏览一遍测试用例,通常都能找到很有参考价值的代码,也能让我们偶然发现很多意想不到的用法。

大部分的测试都包含数据库建表语句和测试数据、MyBatis 配置文件、Mapper.xml 映射文件、Mapper 接口、配套的实体类和测试类。下面以 ancestor_ref 包为例来讲解测试用例,如图 11-16 所示。

这个测试包含两类业务逻辑:第一类是用户和用户之间存在的朋友关系,可能是一对一的,也可能是一对多的;第二类是博客和作者之间的关系,博客属于某个作者,这种关系是一对一的。

image 2024 05 25 22 42 42 888
Figure 1. 图11-16 MyBatis单元测试结构

为了方便测试,MyBatis 基本上都选择内存数据库,这个测试则是选择的 hsqldb 数据库,数据库的配置在 mybatis-config.xml 文件中,代码如下。

从 Mapper.xml 的内容来看,这是用来测试集合嵌套结果映射的,其中两个 resultMap 配置如下。

再来看 AncestorRefTest 的测试代码,测试中通过静态方法初始化 SqlSessionFactory 对象,代码如下。

这里首先读取 mybatis-config.xml 配置文件,通过该文件创建 SqlSessionFactory 对象,然后获取一个连接,使用 CreateDB.sql 中的建表语句和数据初始化数据库。初始化完成后关闭连接,然后具体对每个方法进行测试,示例代码如下。

所有测试方法都是先获取一个 SqlSession 对象,然后获取 Mapper 接口,在调用接口的方法时一定不能忘的就是关闭 SqlSession。

MyBatis 中的大部分测试都是这样,MyBatis 包含的测试非常全面,我们可以通过这些测试用例来学习各个功能的用法,这些测试也是对本书内容最好的补充。