如何获取MockServerContainer的请求列表以验证webhook请求?
使用Testcontainers获取MockServer的请求记录
当然可以,MockServer本身提供了查询已接收请求的API,结合Testcontainers的MockServerContainer,你可以直接调用这些API获取所有请求记录,具体操作如下:
1. 获取MockServer的访问地址
从启动的MockServerContainer实例中拿到容器的可访问端点:
MockServerContainer mockServer = new MockServerContainer(DockerImageName.parse("mockserver/mockserver:5.15.0")); mockServer.start(); String mockServerUrl = mockServer.getEndpoint();
2. 查询所有已接收的请求
MockServer提供/retrieve接口用于获取请求记录,你可以用任意HTTP客户端(比如RestTemplate、OkHttp)发送请求来获取:
// 用RestTemplate示例查询所有请求 RestTemplate restTemplate = new RestTemplate(); List<HttpRequest> recordedRequests = restTemplate.exchange( mockServerUrl + "/retrieve", HttpMethod.GET, null, new ParameterizedTypeReference<List<HttpRequest>>() {} ).getBody();
3. 验证请求体是否符合预期
拿到请求列表后,遍历提取请求体并和预期内容对比:
// 假设这是你的3个预期请求体 List<String> expectedBodies = Arrays.asList("request-body-1", "request-body-2", "request-body-3"); // 提取记录中的请求体 List<String> actualBodies = recordedRequests.stream() .map(request -> request.getBody().toString()) .collect(Collectors.toList()); // 验证数量和内容匹配 assertEquals(expectedBodies.size(), actualBodies.size()); assertTrue(actualBodies.containsAll(expectedBodies));
额外技巧:精准过滤请求
如果不需要查询所有请求,还可以通过/retrieve接口带匹配规则,精准筛选特定请求(比如指定请求方法、路径):
// 构造匹配规则:只查POST到/webhook路径的请求 HttpRequest requestMatcher = HttpRequest.request() .withMethod(HttpMethod.POST.name()) .withPath("/webhook"); List<HttpRequest> filteredRequests = restTemplate.exchange( mockServerUrl + "/retrieve", HttpMethod.PUT, new HttpEntity<>(requestMatcher), new ParameterizedTypeReference<List<HttpRequest>>() {} ).getBody();
另外,测试前后如果需要清空请求记录,可以调用/clear接口:
restTemplate.put(mockServerUrl + "/clear", null);
内容的提问来源于stack exchange,提问作者Roger Frauca Cordoba
相关产品推荐
相关产品推荐

