如何使用Wiremock使用任何静态数据文件检查请求中的path参数?

时间:2018-02-13 21:30:18

标签: wiremock

我创建了一个用于测试API的存根说:http://localhost:8080/test/ {customerName}

使用,如下所示:

wireMock.stubFor(get(urlPathMatching(/test/([A-Z0-9]{10})))
                .willReturn(aResponse().withStatus(OK).withBody("Hello World!"))
        );

我需要做两件事:

  1. 虽然提供了标头和查询参数检查,但是如果我需要检查或提取路径参数客户名称我将如何做到这一点?

  2. 如果我无论如何提取客户名称,那么我将如何检查该客户名称是否存在于特定数据中。 (可能是一个大字符串,数组或文件包含客户名称。)

  3. 我尝试扩展 - >自定义请求匹配器,但无法实现上述任何一项。

    在第一个问题中,您甚至无法使用stubFor(get(url...创建存根。您必须使用名称为自定义请求匹配器的stubFor(requestMatching..进行创建。

2 个答案:

答案 0 :(得分:0)

标准功能将能够匹配URL的customer部分,并在响应中重复使用。在下面的JSON示例中,这是实现的:

{
    "request": {
        "method" : "ANY",
        "urlPattern": "/test/([a-z]*)"
    },
    "response": {
        "status": 200,
        "body": "Hello World: {{request.path.[1]}}",
        "transformers": ["response-template"]
    }
}

发送请求:http://localhost:8080/test/someclientname会产生以下回复:Hello World: someclientname

可以创建一个自定义响应模板,该模板使用标准响应模板手柄功能来解析参数并使用该信息来获取特定文件,或者在不可用时使用通用文件。在高级别中,这个想法在WireMock Google Groups post中被描述。

答案 1 :(得分:0)

您可以覆盖AbstractRegexPattern来捕获路径参数,或者在路径上进行其他测试,甚至两者都做。

    final AtomicReference<String> urlField = new AtomicReference();
    final StringValuePattern urlPattern = new AbstractRegexPattern("/test/([A-Z0-9]{10})") {
        @Override
        public MatchResult match(final String url) {
            final Matcher matcher = pattern.matcher(url);
            if (matcher.find()) {
                urlField.set(matcher.group(1));
            }

            // do additional verification on the URL if necessary
            // ..

            return super.match(url);
        }
    };
    wireMock.stubFor(get(new UrlPattern(urlPattern, true))
            .willReturn(ok().withBody("Hello World!"))
    );

在请求测试后,urlField将包含匹配的URL字段。

    // do the test request
    // ..

    System.out.println("URL field: " + urlField.get());

但是,老实说,这感觉像是一种解决方法,不如WireMock中的标头或查询参数验证可行。


较新的WireMock版本提供了与andMatching(ValueMatcher<Request>)匹配的广泛请求:

    final AtomicReference<String> urlField = new AtomicReference();
    wireMock.stubFor(get(urlMatching("/test/([A-Z0-9]{10})"))
            .andMatching(request -> {
                final String url = request.getUrl();
                final String customerName = url.substring(url.lastIndexOf("/") + 1);
                urlField.set(customerName);

                // do additional verification on the whole request if necessary
                // ..

                return MatchResult.exactMatch(); // or an error
            })
            .willReturn(ok().withBody("Hello World!"))
    );