# CatMock **Repository Path**: ahexian/CatMock ## Basic Information - **Project Name**: CatMock - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-19 - **Last Updated**: 2024-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CatMock CatMock是一个[mock.js](http://mockjs.com/) 的Java封装库。使用JDK自带的js脚本引擎直接调用mock.js脚本,实现对mock.js的统一。让接口设计阶段产生的项目资产能被后端测试复用。 ## Maven 中央仓库地址:[CatMock](https://search.maven.org/artifact/cn.myzju.mock/CatMock) ### 使用Graal.js引擎 ```xml cn.myzju.mock CatMock 2.0.0 ``` ### 使用Nashorn引擎 *不推荐,JDK11中Nashorn引擎已经废弃* ```xml cn.myzju.mock CatMock 1.2.2 ``` ## Mock使用说明 ### 获取CatMock对象 2.x版本CatMock构造方法 ```java CatMock() CatMock(ObjectMapper mapper) CatMock(File file) CatMock(File file, ObjectMapper mapper) CatMock(URL url) CatMock(URL url, ObjectMapper mapper) ``` 1.x版本CatMock构造方法 ```java //使用内置的mock.js文件初始化 CatMock catMock = new CatMock(); //使用外置的mock.js文件进行初始化 CatMock catMock = new CatMock(new FileReader("{path}/mock.js")); //使用内置的mock.js文件初始化,并允许自定义内置的ObjectMapper CatMock catMock = new CatMock(new ObejctMapper()); //使用外置的mock.js文件进行初始化,并允许自定义内置的ObjectMapper CatMock catMock = new CatMock(new FileReader("{path}/mock.js"),new ObejctMapper()); ``` ### getMapper() 可以获得内置的ObjectMapper对象,对其进行配置了。 ```java catmock.getMapper().setSerializationInclusion(Include.ALWAYS); catmock.getMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); ``` ### Random 传入参数:`function`或`function('args')`,返回类型为String ```java catMock.random("string"); //👉P^7 catMock.random("lower(\"HELLO\")");//👉hello ``` **当前已知不兼容函数:** - dataImage() ### Mock 示例可参考[mock.js官方示例](http://mockjs.com/examples.html) **生成Java对象** 传入字符串必须以`{`开始,并以`}`结束 ```java Person person = catMock.mockObject("{\"name\":\"@string\"}",Person.class); ``` **生成Java List** 传入字符串必须以`[`开始,并以`]`结束,如果传入字符串非JsonArray格式,会返回一个size为0的List;如果传入字符串非json格式,可能会报错。 ```java List persons = catMock.mockArray("[{\"name\":\"@string\"},{\"name\":\"@string\"}]",Person.class); ``` **生成String** 1.X 版本中,mock方法传入非JSON格式的字符串(如下`e.g.1`所示)时,前后一定要加上单引号。 2.X 以上版本中,mock方法传入非JSON格式的字符串(如下`e.g.3`所示)时,前后不用加上单引号,加上单引号时,输出结果会加上双引号。 ```java //e.g.1 catMock.mock("'@string'");//👉Anna Jackson //e.g.2 catMock.mock("{\n'regexp|1-5': /\\d{5,10}\\-/\n}");//👉{"regexp": "5912165-6588485-0462848-"} //e.g.3 catMock.mock("'@string'");//👉"Anna Jackson" catMock.mock("'@string'");//👉Anna Jackson ``` ### Extend 生成CatMock对象后,可以通过extend加载自定义函数。 例如新增一个名为`constellation`,用于获取随机星座名称的方法,JavaScript代码如下: ```javascript { constellation: function(date) { var constellations = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座'] return this.pick(constellations) } } ``` 在CatMock中,将脚本代码直接以String类型传入extend函数: ```java 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")//👉白羊座 ``` ## Container使用说明 ### 获取CatContainer ```java //获取的容器内部采用HashMap存储变量 CatContainer container = CatContainer.commonContainer(); //获取的容器内部采用ConcurrentHashMap存储变量 CatContainer container = CatContainer.concurrentContainer(); //获取的容器内部采用HashMap存储变量,并允许自定义内置的ObjectMapper CatContainer container = CatContainer.commonContainer(new ObejctMapper()); //获取的容器内部采用ConcurrentHashMap存储变量,并允许自定义内置的ObjectMapper CatContainer container = CatContainer.concurrentContainer(new ObejctMapper()); ``` ### put() 和常规Map的put有所不同,CatContainer会深入解析符合json串格式的值。 运行如下代码,会在CatContainer内置的Map中产生`a1`、`a1[0]`、`a1[1]`、`a1[0].data`、`a1[0].data.token`、`a1[1].data`、`a1[1].data.token`的``键值对。 ```java container.put("a1","[{\"data\":{\"token\":\"AiOiJKV1\"}},{\"data\":{\"token\":\"J9eXCt9c\"}}]"); ``` ### get() 通过key值获取内置Map中存储的对应value ```java container.get("a1[0].data.token")//👉AiOiJKV1 ``` ### translate() 将传入字符串中的`${key}`替换成相应的值,支持嵌套`${${}}`从内至外顺序解析,如下所示。 ```java //加载数据 container.put("a1","[{\"data\":{\"token\":\"AiOiJKV1\"}},{\"data\":{\"token\":\"J9eXCt9c\"}},{\"data\":{\"tokens\":[\"J9eXCt9c\",\"AiOiJKV1\"]}}]"); container.put("a2","data.token"); container.translate("Bearer ${a1[2].${a2}s[0]}")//👉Bearer J9eXCt9c ``` ### getParams() 获得用于存储``键值对的内置Map对象,可以通过`container.getParams().put()`插入不愿深入解析的json字符串。 **其余函数为内置Map的封装,用法与Map相同** ### getMapper() 可以获得内置的ObjectMapper对象,对其进行配置了。 ```java container.getMapper().setSerializationInclusion(Include.ALWAYS); container.getMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); ``` ## Development Plan - mock.js后续版本的兼容 - 修复JSON处理引擎为Jackson后可能存在的BUG - 修复js引擎修改为Graal.js后可能存在的BUG ## License CatMock is available under the terms of the [MIT License](http://opensource.org/licenses/MIT).