CatMock: Java 下使用 mock.js 生成虚拟数据

2020-02-10 20:47:52 +08:00
 clf

项目地址:https://github.com/lychs1998/CatMock

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 统一,保证接口设计阶段的项目资产能被复用。

Maven

<dependency>
    <groupId>cn.myzju.mock</groupId>
    <artifactId>CatMock</artifactId>
    <version>1.0.1</version>
</dependency>

使用说明

获取 CatMock 对象

//使用内置的 mock.js 文件初始化
CatMock catMock = new CatMock();
//使用外置的 mock.js 文件进行初始化
CatMock catMock = new CatMock(new FileReader("{path}/mock.js"));

Random

传入参数:functionfunction('args'),返回类型为 String

catMock.random("string"); //👉P^7
catMock.random("lower(\"HELLO\")");//👉hello

当前已知不兼容函数:

Mock

示例可参考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-"}

Extend

生成 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'")//👉白羊座

Development Plan

License

CatMock is available under the terms of the MIT License.

2396 次点击
所在节点    分享创造
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/643569

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX