我已经创建了一个存根来测试API说:http://localhost:8080/test/{CusterName}
使用wiremck如下:
wireMock.stubFor(get(urlPathMatching(/test/([A-Z0-9]{10})))
.willReturn(aResponse().withStatus(OK).withBody("Hello World!"))
);
我需要做两件事:
>
虽然wiRemock提供了标头和查询参数检查,但如果我需要检查或提取路径参数客户名称,我将如何做到这一点?
如果我无论如何提取客户名称,那么我将如何检查该客户名称是否存在于特定数据中。(可能是一个大字符串、数组或文件包含客户名称)。
我试着用扩展wireck-
在第一个问题中,您甚至不能使用stuFor(get(url…
创建存根,您必须使用stuFor(request estMatting…
创建,名称为自定义请求匹配器。
您可以覆盖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版本通过和匹配(ValueMatcher
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!"))
);
标准功能将能够匹配URL的客户
部分,并在响应中重用它。在下面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谷歌群组帖子中进行了阐述。