利用H2的自定义函数更好的支持测试

31 10月

在写DAO层的单元测试时,用mock的写法意义不大,因为DAO层的测试更多的关注是Java对象的传递和生成SQL的正确性,所以需要链接真实的数据库。

但是对于单元测试,真实的数据库是很重的,还要依赖于数据库本身的初始化和数据情况。H2作为一个基于Java开发的嵌入式数据库,支持在内存运行,也支持文件模式,非常适合用在单元测试。因为Spring Boot等框架对于这一块的支持很全面了,特别是Spring Boot默认的JDBC测试如果没有配置,会自动启动一个H2的内存数据库。

H2虽然支持很多模式,可以尽可能的模拟不同的数据库,但是还是有一些支持是不完整的,一些数据库特有的方法H2是不支持的,比如MySQL的UNIX_TIMESTAMP。特别是业务上基本都有创建时间和更新时间这两列,unix_timestamp函数大量使用。

这里可以使用H2的一个特性–用户自定义函数,支持两种使用方式

  1. Java方法预编译
  2. Java源代码直接使用

这里来看看如何让H2支持unix_timestamp方法:
首先新建一个新Java类

然后使用SQL创建一个别名,并将别名链接到我们的Java类的对应方法中

然后在初始化Datasource的时候执行该SQL语句就行了

参考

http://www.h2database.com/html/features.html#user_defined_functions
https://hyrepo.com/tech/h2-unit-test/

发表评论

电子邮件地址不会被公开。