我创建了一个用于测试API的存根说:http://localhost:8080/test/ {customerName}
使用wiremock,如下所示:
wireMock.stubFor(get(urlPathMatching(/test/([A-Z0-9]{10})))
.willReturn(aResponse().withStatus(OK).withBody("Hello World!"))
);
我需要做两件事:
答案 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!"))
);