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

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2018/10/31/h2-user-defined-functions-to-support-test/

在写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类

public class H2Extended {
    public static int unix_timestamp() {
        return (int)(System.currentTimeMillis() / 1000);
    }
}

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

CREATE ALIAS UNIX_TIMESTAMP FOR "com.huangyunkun.tool.H2Extended.unix_timestamp";

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

参考

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

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2018/10/31/h2-user-defined-functions-to-support-test/

《利用H2的自定义函数更好的支持测试》有1条评论

回复 匿名 取消回复