You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus WireMock求助:RequestBody实际与预期不匹配问题

WireMock请求体验证失败问题解决

问题核心

你遇到的问题本质是预期值与实际请求体的内容完全不匹配:你定义的ENTITY_SAMPLE是某个实体对象的toString()输出(带Entity{entity=..., variant=...}的包装结构),但实际发送到WireMock的请求体是该实体中包含的纯XML内容,两者结构完全不同,所以无论用equalTo、contains还是matching都会失败。

代码里的明显问题

  1. 拼写错误:验证代码里写的ENITTY_SAMPLE是笔误,正确的变量名是ENTITY_SAMPLE,这个错误会直接导致验证逻辑失效。
  2. 预期值错误:ENTITY_SAMPLE包含了实体类的toString包装信息,并非实际发送的HTTP请求体内容。

修复方案

方案1:使用纯XML作为预期值

直接提取ENTITY_SAMPLE中的XML部分作为预期值,去掉实体包装:

private static final String EXPECTED_XML =
        "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">"
        + "<SOAP-ENV:Header><requestingParty xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\">12345678"
        + "</requestingParty></SOAP-ENV:Header><SOAP-ENV:Body SOAP-ENV:encodingStyle=\"UTF-8\"><note>\n"
        + "<to>Tove</to>\n"
        + "<from>Jani</from>\n"
        + "<heading>Reminder</heading>\n"
        + "<body>Don't forget me this weekend!</body>\n"
        + "</note></SOAP-ENV:Body></SOAP-ENV:Envelope>";

然后修改验证逻辑:

wireMock.verifyThat(postRequestedFor(urlEqualTo("/my/url"))
        .withRequestBody(equalTo(EXPECTED_XML)));

方案2:使用XML专用匹配器(推荐)

如果XML存在换行、空格、缩进的细微差异,纯字符串匹配可能依然失败,建议使用WireMock提供的XML专用匹配器equalToXml,它会忽略XML的格式差异,只校验语义:

import static com.github.tomakehurst.wiremock.client.WireMock.equalToXml;

// 验证时使用equalToXml替代equalTo
wireMock.verifyThat(postRequestedFor(urlEqualTo("/my/url"))
        .withRequestBody(equalToXml(EXPECTED_XML)));

方案3:从实体对象直接生成XML(更严谨)

如果你的代码是从实体对象序列化生成XML发送的,建议直接用相同的序列化逻辑生成预期XML,避免手动拼接字符串出错:

// 假设你的实体类是Entity,有对应的XML序列化方法
Entity sampleEntity = // 构造你的样本实体
String EXPECTED_XML = yourXmlSerializer.serialize(sampleEntity);

内容的提问来源于stack exchange,提问作者3nterAUs3rname

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:27:10