使用动态数组调用Karate Feature时抛出PolyglotException错误求助
问题代码
def response = ['val1','val2'] def myKeys = response.map(function(obj){ return obj.key }) def callExtTest ="""function(key) { var myEncodedKey = karate.urlEncode(key); var myFinalUrl = url.replace('{key}', myEncodedKey); var result = karate.call(read('test.feature'), { myUrl: myFinalUrl }); results.add(result); }""" karate.forEach(myKeys, callExtTest)
错误信息
rg.graalvm.polyglot.PolyglotException: TypeError: invokeMember (call) on com.intuit.karate.core.ScenarioBridge@761ac53 failed due to: no applicable overload found (overloads: [Method[public java.lang.Object com.intuit.karate.core.ScenarioBridge.call(java.lang.String)], Method[public java.lang.Object com.intuit.karate.core.ScenarioBridge.call(boolean,java.lang.String,org.graalvm.polyglot.Value)], Method[public java.lang.Object com.intuit.karate.core.ScenarioBridge.call(java.lang.String,org.graalvm.polyglot.Value)], Method[public java.lang.Object com.intuit.karate.core.ScenarioBridge.call(boolean,java.lang.String)]],arguments: [JavaObject[classpath:features/filename.feature (com.intuit.karate.core.Feature)] (HostObject), DynamicObject@68b0e5ec (DefaultLayout)])
.:anonymous(Unnamed:4)
原因分析
- 调用方法重载不匹配:
karate.call的重载列表中,没有「Feature对象 + 参数Map」的组合。你用read('test.feature')返回了Feature实例,再传入参数Map,触发了无匹配重载的错误。 - 数据结构错误:
response是字符串数组,obj.key访问会返回undefined,最终myKeys是无效的[undefined, undefined],导致后续URL替换逻辑失效。 - 变量未初始化:
results变量未提前声明初始化,调用results.add()会触发额外错误。
解决办法
- 修正
karate.call调用方式:直接传递Feature路径字符串而非read()返回的Feature对象,搭配参数Map:
若需复用上下文,可使用带布尔参数的重载:var result = karate.call('test.feature', { myUrl: myFinalUrl });var feature = read('test.feature'); var result = karate.call(true, feature.path, { myUrl: myFinalUrl }); - 修正数据结构:将
response改为含key属性的对象数组,确保myKeys能获取有效值:def response = [{key: 'val1'}, {key: 'val2'}] - 初始化结果数组:提前声明
results为空数组:def results = []
内容的提问来源于stack exchange,提问作者user1980552

