在以前我做开发的时候,经常会遇到需要向数据库中添加假数据的需求,有时又需要使用批量的随机数据来验证接口或是方法的稳定性以及容错测验。那个时候我还不知道有类似于 jmockdata 或是 easy-random 的数据生成工具,就只有傻傻地用姓名库和for
循环来构造数据。
后来我知道了 __jmockdata__,也用过 __easy-random__,不过使用体验并不是很好。例如 jmock 会复用对象导致循环引用时无法转json
, easy-random 构造自定义数据有点麻烦,总的来说它们和我预想的构建模式并不是很相符。我还是期望那种更加自由的、能凭直觉就定义数据构建方法的构建工具,比如 weight 和 height 能使用不同的随机方式,而不只是简单的范围随机。
而mock-data就实现了我的想法。例如实现基础的数据构建,就像下面这样:
1 | MockDataCreator creator = new MockDataCreator(); |
不过这也是最基本的,构建自定义对象才是重点,毕竟这是用来做自定义数据的。我个人觉得这样的方式还是比较符合直觉的:
1 | // 创建数据构造器 |
其中的DoubleRandomCreator
实际上是实现的DataCreator
接口,开发者可以通过实现这个接口来自定义构建方式:
1 | public interface DataCreator<R> extends TypeGetter { |
所以实际上就只需要实现一个方法就可以了,MockSrc
里面包括了目前的构建目标信息,便于开发者进行选择构建。mock-data 也为接口构建提供了接口构建器,让MockDataCreator
可以自动选择合适的实现类来完成接口的构造工作,内置的List
、Set
和Map
就是使用的接口构建器,这样所有实现这三个接口的类(例如ArrayList
、HashSet
、HashMap
等)都可以自动构建对应的对象,而不需要对它们重新设置。
当然,循环依赖生成的是独立对象,并且可以自定义每个类的循环深度。不过这些都是比较基础的功能,还不能达到我心中的便捷,毕竟如果需要构建出一个假的“真实”数据,开发者还是需要自己去设定每一个属性或是类的构建模型。虽然也可以通过结合 JavaFaker 的方式解决,但不够优雅,所以在 mock-data 在3.0版本加入了属性数据池模型,开发者只需要构建一个属性数据池,就可以让MockDataCreator
优先使用数据池中的数据。这样做似乎与 JavaFaker 很相似?并不是,属性数据池包括了三个目标: 类型(Class)__、__属性名(支持正则匹配)__、__数据池(数据对象数组)__。__类型 与 属性名 用来指定 数据池 的适用目标。使用方式就像下面这样:
1 | MockDataCreator creator = new MockDataCreator(); |
这样似乎也不优雅?确实,所以 mock-data 实际上是提供了一个数据池框架,开发者完全可以通过继承FieldDataPool
来构建配置文件填充的数据池。并且在 mock-data 的test包中其实也实现了一个properties
的数据池,只需要把数据池信息写在properties
中就可以控制数据池填充了,就像这样:
1 | int#age=[22, 23, 24, 25, 25, 27] |
详细内容可以看 这里。
也就是说,mock-data 集成了完善的虚拟数据构建模型,并且泛型的兼容性与性能也还不错,具体可以看下下面的图片:
具体的测试内容可以把代码 clone 下来,在test包下查看。