Quarkus WireMock求助:RequestBody实际与预期不匹配问题
WireMock请求体验证失败问题解决
问题核心
你遇到的问题本质是预期值与实际请求体的内容完全不匹配:你定义的ENTITY_SAMPLE是某个实体对象的toString()输出(带Entity{entity=..., variant=...}的包装结构),但实际发送到WireMock的请求体是该实体中包含的纯XML内容,两者结构完全不同,所以无论用equalTo、contains还是matching都会失败。
代码里的明显问题
- 拼写错误:验证代码里写的
ENITTY_SAMPLE是笔误,正确的变量名是ENTITY_SAMPLE,这个错误会直接导致验证逻辑失效。 - 预期值错误:
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
相关产品推荐
相关产品推荐

