如何用Wiremock捕获已存根POST请求的请求体?类似Mockito ArgumentCaptor
WireMock捕获POST请求体的方法(类似Mockito ArgumentCaptor)
方法1:利用WireMock请求日志(最简便)
WireMock默认会记录所有请求,你可以通过匹配存根的请求规则,从日志中提取请求体:
- 保留原有存根代码:
stubFor(post(urlPathEqualTo(getUploadEndpoint())) .willReturn(aResponse().withStatus(HttpStatus.OK.value())));
- 执行测试请求后,获取匹配的请求并提取请求体:
// 获取所有符合该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:自定义请求监听器(实时捕获)
如果需要在请求到达时就捕获,可以添加一个请求监听器:
- 初始化存储容器,给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()); } });
- 执行测试请求后,从容器中取出请求体断言:
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
相关产品推荐
相关产品推荐

