为了让单元测试尽可能的脱离开发环境种种依赖, 最好的办法是在单元测试的时候引入内存数据库.
之前我们也曾使用过 hsqldb 来做单元测试, 但是在刚开始的时候, 还能满足简单的测试需求;
随着数据库结构和查询条件越来越复杂, 发现 hsqldb 的弊端体现的越来越明显, 最终不得不放弃它.
hsqldb 在使用中碰到的最大的几个问题是, 与 mysql 数据库的 sql 存在较大差异, 尤其体现在 自增ID 和 LIMIT 的使用上.
使得我们为了单元测试而不得不去维护两套不同的 sql. 成本非常大, 也丧失了单元测试的优点.
直到我们引用了 h2:
相比 hsqldb 而言, h2 带来的最大改善, 就是几乎完全兼容以前 mysql sql, DDL 直接就能正常执行, 简直太方便了.
下面说一下简单的配置, 以方便大家作参考.
maven 配置文件 pom.xml 中引入相关的 dependency:
1 | <dependency> |
下面为单元测试指定 datasource.
个人经验是, 为了方便开发环境和单元测试环境使用不同的 datasource, 我们将 spring 中关于 datasource 的配置单独放在一个文件中.
这样的好处是, 在 src/main/resources/
和 src/test/resources/
下各有一个同名的 datasource 配置文件, 而在执行 test 时, 会自动用 test resources 中的配置文件替换 main中的配置.
applicationContext-datasource.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
这里看到我们导入了两个 sql 文件, 分别用来创建表结构和导入测试数据. 基本的 sql 语法就不说, 记得在 sql 的第一行 标注 SET MODE MYSQL;
用来表示兼容 mysql 语义:
1 | SET MODE MYSQL; |
之后在 applicationContext.xml import 这个文件:
applicationContext.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
之后的操作就没什么好说了, 最好创建一个单元测试的 BASE 类, 用来继承 TestNG 和加载 Spring 配置文件:
1 | /** |
而真正的单元测试 class 继承该类:
1 | /** |
后面不用说了, 执行就是了.