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

如何用Wiremock捕获已存根POST请求的请求体?类似Mockito ArgumentCaptor

WireMock捕获POST请求体的方法(类似Mockito ArgumentCaptor)

方法1:利用WireMock请求日志(最简便)

WireMock默认会记录所有请求,你可以通过匹配存根的请求规则,从日志中提取请求体:

  1. 保留原有存根代码:
stubFor(post(urlPathEqualTo(getUploadEndpoint()))
        .willReturn(aResponse().withStatus(HttpStatus.OK.value())));
  1. 执行测试请求后,获取匹配的请求并提取请求体:
// 获取所有符合该POST端点的请求记录
List<LoggedRequest> matchedRequests = findAll(postRequestedFor(urlPathEqualTo(getUploadEndpoint())));

// 取最后一次请求(如果测试中只发了一次请求,直接get(0)也可)
LoggedRequest capturedRequest = matchedRequests.get(matchedRequests.size() - 1);
String requestBody = capturedRequest.getBodyAsString();

// 对请求体进行断言,比如宽松的XML校验
assertTrue(requestBody.contains("<expected-node>some-value</expected-node>"));

方法2:自定义请求监听器(实时捕获)

如果需要在请求到达时就捕获,可以添加一个请求监听器:

  1. 初始化存储容器,给WireMock服务添加监听器:
// 用来存储捕获的请求体
List<String> capturedBodies = new ArrayList<>();

// 给WireMockServer添加监听器(针对独立服务实例)
wireMockServer.addMockServiceRequestListener((request, response) -> {
    // 匹配目标端点和请求方法
    if (request.getUrl().equals(getUploadEndpoint()) && request.getMethod().equals(RequestMethod.POST)) {
        capturedBodies.add(request.getBodyAsString());
    }
});
  1. 执行测试请求后,从容器中取出请求体断言:
String capturedBody = capturedBodies.get(0);
// 用XML解析工具转成对象后校验属性(更灵活)
YourXmlDto dto = xmlObjectMapper.readValue(capturedBody, YourXmlDto.class);
assertEquals("预期值", dto.getTargetField());

关于XML的宽松断言

不用equalToXml的话,推荐两种方式:

  • 使用WireMock的containsXml匹配器(校验部分内容):
    stubFor(post(urlPathEqualTo(getUploadEndpoint()))
            .withRequestBody(containsXml("<expected-node>some-value</expected-node>"))
            .willReturn(aResponse().withStatus(200)));
    
  • 将XML字符串转成Java对象,通过对象属性断言(适配复杂结构),可借助Jackson XML、JAXB等工具实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:36:26