CatMock是一个mock.js 的Java封装库。使用JDK自带的js脚本引擎直接调用mock.js脚本,实现对mock.js的统一。让接口设计阶段产生的项目资产能被后端测试复用。
中央仓库地址:CatMock
<dependency>
<groupId>cn.myzju.mock</groupId>
<artifactId>CatMock</artifactId>
<version>2.0.0</version>
</dependency>
不推荐,JDK11中Nashorn引擎已经废弃
<dependency>
<groupId>cn.myzju.mock</groupId>
<artifactId>CatMock</artifactId>
<version>1.2.2</version>
</dependency>
2.x版本CatMock构造方法
CatMock()
CatMock(ObjectMapper mapper)
CatMock(File file)
CatMock(File file, ObjectMapper mapper)
CatMock(URL url)
CatMock(URL url, ObjectMapper mapper)
1.x版本CatMock构造方法
//使用内置的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());
可以获得内置的ObjectMapper对象,对其进行配置了。
catmock.getMapper().setSerializationInclusion(Include.ALWAYS);
catmock.getMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
传入参数:function
或function('args')
,返回类型为String
catMock.random("string"); //👉P^7
catMock.random("lower(\"HELLO\")");//👉hello
当前已知不兼容函数:
- dataImage()
示例可参考mock.js官方示例
生成Java对象
传入字符串必须以{
开始,并以}
结束
Person person = catMock.mockObject("{\"name\":\"@string\"}",Person.class);
生成Java List
传入字符串必须以[
开始,并以]
结束,如果传入字符串非JsonArray格式,会返回一个size为0的List;如果传入字符串非json格式,可能会报错。
List<Person> persons = catMock.mockArray("[{\"name\":\"@string\"},{\"name\":\"@string\"}]",Person.class);
生成String
1.X 版本中,mock方法传入非JSON格式的字符串(如下e.g.1
所示)时,前后一定要加上单引号。
2.X 以上版本中,mock方法传入非JSON格式的字符串(如下e.g.3
所示)时,前后不用加上单引号,加上单引号时,输出结果会加上双引号。
//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
生成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")//👉白羊座
//获取的容器内部采用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());
和常规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
的<K, V>
键值对。
container.put("a1","[{\"data\":{\"token\":\"AiOiJKV1\"}},{\"data\":{\"token\":\"J9eXCt9c\"}}]");
通过key值获取内置Map中存储的对应value
container.get("a1[0].data.token")//👉AiOiJKV1
将传入字符串中的${key}
替换成相应的值,支持嵌套${${}}
从内至外顺序解析,如下所示。
//加载数据
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
获得用于存储<K, V>
键值对的内置Map对象,可以通过container.getParams().put()
插入不愿深入解析的json字符串。
其余函数为内置Map的封装,用法与Map相同
可以获得内置的ObjectMapper对象,对其进行配置了。
container.getMapper().setSerializationInclusion(Include.ALWAYS);
container.getMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
- mock.js后续版本的兼容
- 修复JSON处理引擎为Jackson后可能存在的BUG
- 修复js引擎修改为Graal.js后可能存在的BUG
CatMock is available under the terms of the MIT License.