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

 
 
 
 
 

Java

 
1
2
3
4
5
public class H2Extended {
    public static int unix_timestamp() {
        return (int)(System.currentTimeMillis() / 1000);
    }
}

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

 
 
 
 
 
 

MySQL

 
1
CREATE ALIAS UNIX_TIMESTAMP FOR "com.sankuai.meituan.banma.thrift.csc.tool.H2Extended.unix_timestamp";

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

参考

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

利用H2的自定义函数更好的支持测试的更多相关文章

  1. excel自定义函数添加和使用方法

    第一,excel自定义函数简介 Excel自带很多函数供使用,但有些问题用内置函数解决起来很复杂,甚至是无能为力,这时就可以利用VBA开发自定义函数. 第二,excel如何添加自定义函数 excel自 ...

  2. 巧妙利用JS中的自定义函数——化繁为简,提高效率

    利用自定义函数编写年月日时间表: (复杂写法)如下: <body>                <select id="year" size="1&q ...

  3. 利用jQuery扩展接口为jQuery框架定义了两个自定义函数,然后调用这两个函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 浅谈Excel开发:六 Excel 异步自定义函数

    上文介绍了Excel中的自定义函数(UDF ),它极大地扩展了Excel插件的功能,使得我们可以将业务逻辑以Excel函数的形式表示,并可以根据这些细粒度的自定义函数,构建各种复杂的分析报表. 普通的 ...

  5. Sqlserver自定义函数Function

    一.FUNCTION: 在sqlserver2008中有3中自定义函数:标量函数/内联表值函数/多语句表值函数,首先总结下他们语法的异同点: 同点:1.创建定义是一样的:                ...

  6. 17.python自定义函数

    什么是函数,函数说白了就是将一系列代码封装起来,实现代码的重用. 什么是代码重用? 假设我有这样的需求: 但是我还是觉得太麻烦了,每次想吃饭的时候都要重复这样的步骤.此时,我希望有这样的机器:

  7. python学习之--自定义函数:

    Python之--自定义函数: 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 以下自定义 ...

  8. 利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载

    简述 可能大家都知道,php中有一个函数叫debug_backtrace,它可以回溯跟踪函数的调用信息,可以说是一个调试利器. 好,来复习一下 01 one(); 02 03 function one ...

  9. (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】

    原文地址:http://www.cnblogs.com/melonblog/archive/2013/05/09/3062303.html 原文作者:豆浆油条 - melon 本文示例代码测试环境是W ...

  10. LR11中自定义函数web_custom_request请求

    Action() { char * ip,temp; int state; double time_elapsed, duration, waste; merc_timer_handle_t time ...

随机推荐

  1. C# webapi 跨域

    #region 启用跨域访问 app.UseCors(builder => builder .AllowAnyMethod() .SetIsOriginAllowed(_ => true) ...

  2. KubeSphere 社区双周报 | KubeKey v3.0.7 发布 | 2023-02-03

    KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...

  3. SpringBoot 设置编码UTF-8

    第一种  通过过滤器来设置 @Configuration public class UtfConfig { @Bean public FilterRegistrationBean filterRegi ...

  4. 【Python】公众号聚合登录软件+源码

    废话不多说了,直接上图,回复拿软件和源码[自己打包,配置环境比较复杂] 写这个软件就是因为其他平台的会员太贵了,还不如自己写个,不限制账号登录数~ 授权,打开和删除功能都是正常的, 面板功能,我打算做 ...

  5. Qt Creator快捷键记录

    Ctrl + K:代码格式化(先选中要格式化的代码) F4:在头文件和源文件之间切换 Ctrl+/:注释和取消注释 F2:在声明和实现之间切换 Ctrl+K:打开定位器(locator),搜索文件名 ...

  6. 如何在cnblogs的发文中使用自定义地址作为发文链接

    要知道在cnblogs中发表内容后其默认的链接地址都是一串数字的形式,比如本篇的默认地址:https://www.cnblogs.com/xyz/p/18461898 但是为了让发表的内容更有个性化, ...

  7. Linux Shell_函数

    目录 简要介绍 系统函数 basename direname 自定义函数 基本语法 简要介绍 shell编程和其它编程语言一样,有系统函数,也可以自定义函数.系统函数中,我们这里就介绍两个. 系统函数 ...

  8. 内网IP地址实现HTTPS加密访问教程

    一.前期准备 确定内网IP地址: 确保有一个明确且固定的内网IP地址.动态IP地址可能不适合此场景,因为它们会频繁改变,导致SSL证书失效. 选择SSL证书颁发机构(CA): 选择一个受信任的CA,如 ...

  9. [python] asyncio库常见问题与实践案例

    本文详细介绍了在使用asyncio库编写异步程序时常见的错误和问题,并进一步通过实践案例进行分析和讨论,以便在项目中更有效地应用asyncio库.有关asyncio库的详细介绍,可参考:Python ...

  10. golang之代码检查工具golangci-lint

    日常开发中,想要保证工程中代码能够正常运行, 一般都会使用vet进行代码静态扫描, 但是每次手动执行命令有点不太方便,如果在每次开发完成之后,git提交的时候都进行下检查就OK了,想好就干!!! 这里 ...