KARATE:设置更新后的XML负载是否会覆盖同名现有标签?
问题原因
这两个现象都是Karate处理XML的默认预期行为,不存在配置遗漏:
set关键字针对XML同层级节点的默认操作是追加,不是覆盖,所以原有自闭合标签会保留,新节点会并排展示。- JSON转XML的映射逻辑严格按对象层级处理,如果直接把
fromTime、toTime两个平级属性传给XML节点,Karate只会把第一个属性作为节点文本值,后续属性会被忽略,所以必须包在共同的父节点对象中。
最优解决方案
不需要额外加复杂的条件判断,调整三步即可:
1. 调整预定义envelope.xml
删除预定义的自闭合<DefaultConfigRequest/>标签,envelope内容简化为:
<ser:getDefaultConfig> </ser:getDefaultConfig>
2. 调整可复用Feature的赋值逻辑
在可复用Feature中统一处理空入参的兼容逻辑,自动生成符合要求的节点:
@Reusable Feature: Get Default Config Background: Given url baseUrl + '/DataInterface' # 接收调用方入参,自动判断是否为空生成对应节点 * def rawParams = __arg * def requestNode = rawParams != null ? { DefaultConfigRequest: rawParams } : { DefaultConfigRequest: null } * xml params = requestNode Scenario: Get Default Config - getDefaultConfig Given set envelope /Envelope/Body = read('classpath:path/to/envelope.xml') And set envelope /Envelope/Body/getDefaultConfig = params And request envelope And header Content-Type = 'application/soap+xml; charset=utf-8' When method post Then def result = response
3. 调整调用方传参逻辑
调用方不需要再额外包DefaultConfigRequest外层,直接传参数即可:
Given def expectedTimes = """ { 'fromTime': #(fromTime), 'toTime': #(toTime) } """
验证效果
- 无入参调用时,自动生成
<DefaultConfigRequest/>自闭合标签,符合请求合法性要求 - 有入参调用时,只会生成一个带内容的
<DefaultConfigRequest>节点,不会出现重复标签 - 调用方无需重复编写父节点封装逻辑,复用性更高
内容的提问来源于stack exchange,提问作者jfont
相关产品推荐
相关产品推荐

