升级Karate与Java后全局定义的Java及JavaScript函数异常问题
Karate 1.4.1 + Java 11 升级后全局JS函数与Java类型问题解决
问题1:全局Java类型调用触发ReferenceError
升级后,原karate-config.js中通过config.TimestampObject = Java.type('utils.Timestamp')定义的Java类型,在场景中直接调用时报错,示例代码:
* set userProfile.firstName = UserMockHelper.getRandomFirstName();
报错信息:
org.graalvm.polyglot.PolyglotException: ReferenceError: "UserMockHelper" is not defined
解决方法
Karate 1.3+ 切换为GraalVM作为JS引擎,全局变量处理逻辑变更。需在karate-config.js中使用karate.set()将Java类型注册为全局变量,而非赋值给config对象:
// 替换原config赋值方式 karate.set('UserMockHelper', Java.type('utils.UserMockHelper')); karate.set('TimestampObject', Java.type('utils.Timestamp'));
修改后Java类型可在所有场景中直接调用。
问题2:JS函数无法在JSON验证(#?表达式)中使用
原全局定义的JS函数可在场景中直接执行,但在match的#?断言中使用时触发TypeError,示例代码:
And match response.docs[0] contains { timestamp: "#? isValidDateTime(_)" }
报错信息:
TypeError: execute on {} failed due to: Message not supported.
解决方法
GraalVM的表达式上下文无法直接访问config对象中的函数,需将JS函数注册为全局函数:
- 在
karate-config.js中读取JS函数后,用karate.set()全局暴露:
const isValidDateTime = read('classpath:validators/datetime-validator.js'); karate.set('isValidDateTime', isValidDateTime);
- 若函数逻辑简单,也可直接在
karate-config.js中定义全局函数:
karate.set('isValidDateTime', function(timestamp) { // 写入datetime-validator.js中的函数逻辑 });
修改后#? isValidDateTime(_)可正常在断言中执行。
内容的提问来源于stack exchange,提问作者elPaso
相关产品推荐
相关产品推荐

