Karate1.3.1(Java8) Mock服务报错:Expected ; but found Addition
Karate Mock服务语法错误导致POST请求404问题解决
问题现象
使用Java 8搭配Karate 1.3.1框架创建Mock服务时,所有场景均触发异常,POST /api/add 请求返回404。核心错误提示为:org.graalvm.polyglot.PolyglotException: SyntaxError: Unnamed:1:5 Expected ; but found Addition
错误日志
17:52:36.492 [armeria-common-worker-nio-2-1] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@19037a8b 17:52:36.673 [armeria-common-worker-nio-2-2] WARN com.intuit.karate - scenario match evaluation failed at line 9: Mock Addition - com.intuit.karate.KarateException: js failed: 01: Mock Addition <<<< org.graalvm.polyglot.PolyglotException: SyntaxError: Unnamed:1:5 Expected ; but found Addition Mock Addition ^
错误栈
- org.graalvm.polyglot.Context.eval(Context.java:425)
- com.intuit.karate.graal.JsEngine.evalForValue(JsEngine.java:139)
- com.intuit.karate.graal.JsEngine.eval(JsEngine.java:135)
- com.intuit.karate.core.ScenarioEngine.evalJs(ScenarioEngine.java:1190)
- com.intuit.karate.core.MockHandler.isMatchingScenario(MockHandler.java:274)
- com.intuit.karate.core.MockHandler.handle(MockHandler.java:175)
- com.intuit.karate.http.HttpServerHandler.lambda$serve$0(HttpServerHandler.java:59)
原Feature代码
Feature: Mock API for Calculator Background: * def response = {} * def userInfo = { user: 'info' } Given url 'http://localhost:8083/api/' Scenario: Mock Addition Given path 'add' And method POST And def params = karate.jsonPath(request, '$.params') Then match params == [1, 2] And def result = params[0] + params[1] And def response = { result: '#(result)', user: '#(userInfo.user)' }
修复方案
问题根源在于Background块中错误使用了Given url语句。Karate的Mock服务不需要在Background中设置url,该语句会被GraalVM错误解析为JavaScript代码,引发语法错误。
移除Background中的Given url语句即可解决问题,修改后的Feature代码如下:
Feature: Mock API for Calculator Background: * def response = {} * def userInfo = { user: 'info' } Scenario: Mock Addition Given path 'add' And method POST And def params = karate.jsonPath(request, '$.params') Then match params == [1, 2] And def result = params[0] + params[1] And def response = { result: '#(result)', user: '#(userInfo.user)' }
Mock服务的路由匹配由path和method字段控制,无需提前设置url。修复后,POST /api/add 请求可正常命中Mock场景并返回预期响应。
内容的提问来源于stack exchange,提问作者DrTokenizer
相关产品推荐
相关产品推荐

