项目地址:https://github.com/lychs1998/CatMock
CatMock 是一个mock.js的 Java 封装库。使用 JDK 自带的 js 脚本引擎直接调用 mock.js 脚本,实现对 mock.js 的统一。
在开发互联网应用时,前后端在开发前使用接口管理平台设计接口。市面上常见的接口管理平台大部分使用了 Mock.js 作为虚拟接口和接口测试的工具。
设计接口时,接口的定义是项目的重要资产。Mock.js 能很好地完成后端接口的单元测试。但后端在 CI/CD 进行集成测试时,往往需要自行编写测试用例,需要使用其它方式生成虚拟数据,无法复用接口设计阶段的项目资产。
于是开始尝试使用纯 Java 编写一个兼容 Mock.js 语法的 Mock 工具:为了实现拓展自定义函数的功能,曾设计使用 Java 的 Function 接口对象作为用户自定义传入的函数来使用,但最后放弃了这一想法,因为写工具的初衷在于复用接口设计阶段的项目资产,而 Function 需要后端重新编写。
最后,选择在 Java 中使用 Java 内置的 JavaScript 引擎直接调用 mock.js ,这样能保证和 mock.js 统一,保证接口设计阶段的项目资产能被复用。
<dependency>
<groupId>cn.myzju.mock</groupId>
<artifactId>CatMock</artifactId>
<version>1.0.1</version>
</dependency>
//使用内置的 mock.js 文件初始化
CatMock catMock = new CatMock();
//使用外置的 mock.js 文件进行初始化
CatMock catMock = new CatMock(new FileReader("{path}/mock.js"));
传入参数:function
或function('args')
,返回类型为 String
catMock.random("string"); //👉P^7
catMock.random("lower(\"HELLO\")");//👉hello
当前已知不兼容函数:
示例可参考mock.js 官方示例
生成 Java 对象
传入字符串必须以{
开始,并以}
结束
Person person = catMock.mockObject("{\"name\":\"@string\"}",Person.class);
生成 Java List
传入字符串必须以[
开始,并以]
结束
List<Person> persons = catMock.mockArray("[{\"name\":\"@string\"},{\"name\":\"@string\"}]",Person.class);
生成 String
mock 方法传入非 JSON 格式的字符串(如下e.g.1
所示)时,前后一定要加上单引号。
//e.g.1
catMock.mock("'@name'");//👉Anna Jackson
//e.g.2
catMock.mock("{\n'regexp|1-5': /\\d{5,10}\\-/\n}");//👉{"regexp": "5912165-6588485-0462848-"}
生成 CatMock 对象后,可以通过 extend 加载自定义函数。
例如新增一个名为constellation
,用于获取随机星座名称的方法,JavaScript 代码如下:
{
constellation: function(date) {
var constellations = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']
return this.pick(constellations)
}
}
在 CatMock 中,将脚本代码直接以 String 类型传入 extend 函数:
CatMock catMock = new CatMock()
catMock.extend("{\n" +
" constellation: function(date) {\n" +
" var constellations = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']\n" +
" return this.pick(constellations)\n" +
" }\n" +
"}");
catMock.random("constellation")//👉水瓶座
catMock.mock("'@constellation'")//👉白羊座
xxx.xxx[index].xxx
的 key 值进行调用容器内的变量CatMock is available under the terms of the MIT License.