Karate 1.2.0 Mock错误收集接口返回空数组问题求助
问题原因
Karate 1.2.0中,Mock服务里def errors = []定义的是每个请求会话的局部变量,并非跨请求的全局变量。你的测试用例向/mytest发起请求时,和之前调用/services/myService/{id}的请求属于不同会话上下文,因此errors数组是空的;而Postman调用时是连续执行put和get请求,共享同一会话,所以能获取到错误数据。此外,你的Mock路径定义存在语法错误:pathMatches('/services/myService/{id}}')多了一个闭合大括号,可能导致put请求未匹配到对应Scenario,进而未更新errors数组。
解决方案
1. 修复Mock路径语法错误
先修正路径中的多余大括号,确保put请求能正确匹配:
Scenario: pathMatches('/services/myService/{id}') && methodIs('put') * def result = karate.match("$request//UpdateRequest/activity == 'wrong_activity'") * if (!result.pass) { karate.appendTo(errors, result) } * def responseStatus = 200
2. 确保测试用例在同一会话中执行请求
如果测试逻辑是先调用put接口触发断言,再调用/mytest获取错误,需将两个请求放在同一个测试Scenario中,共享Mock服务上下文:
Scenario: Verify mock error collection # 先调用put接口触发断言逻辑 Given url 'http://localhost:9866/services/myService/123' And request { UpdateRequest: { activity: 'wrong_activity' } } When method put Then status 200 # 紧接着调用/mytest获取错误数组 Given url 'http://localhost:9866/mytest' When method get Then status 200 And match response.errors != []
3. 使用全局单例存储错误(跨会话共享)
如果需要跨多个请求会话共享errors数组,可借助Java静态类实现全局存储:
步骤1:创建Java静态类
在项目classpath下创建如下类(比如com/example/ErrorsHolder.java):
package com.example; import java.util.ArrayList; import java.util.List; public class ErrorsHolder { private static final List<Object> errors = new ArrayList<>(); public static List<Object> getErrors() { return errors; } public static void addError(Object error) { errors.add(error); } public static void clear() { errors.clear(); } }
步骤2:修改Mock服务代码
在Background中替换原有errors定义,改用全局单例存储:
Background: * def ErrorsHolder = Java.type('com.example.ErrorsHolder') * def errors = ErrorsHolder.getErrors() Scenario: pathMatches('/services/myService/{id}') && methodIs('put') * def result = karate.match("$request//UpdateRequest/activity == 'wrong_activity'") * if (!result.pass) { ErrorsHolder.addError(result) } * def responseStatus = 200 Scenario: pathMatches('/mytest') * configure responseHeaders = { 'Content-Type': 'application/json' } * def responseStatus = 200 * def response = {'errors':'#(errors)'}
步骤3:测试用例中清理全局存储(可选)
为避免测试用例间污染,建议在测试开始/结束时清理全局错误列表:
Background: * def ErrorsHolder = Java.type('com.example.ErrorsHolder') * callonce ErrorsHolder.clear()
内容的提问来源于stack exchange,提问作者Ekaterina A
相关产品推荐
相关产品推荐

