我正在尝试测试一个 openid 提供程序类。openid 消费者类正在发出一个 http 请求。我正在使用wiremock 模拟对这个请求的响应。我试图模拟一个有效的 openid 响应。但是,有效响应取决于请求参数。使用wiremock,我可以设置一个模拟请求,其中响应的主体取决于请求参数吗?
5 回答
这是可能的,您只需要使用 ResponseTansformer。在下面的示例代码中,responseDefinition 由下面给出的存根确定。在这里,我通过简单地将正文字节返回给调用者来模拟编码服务。尽管在变压器中,我可以根据请求的内容自由地返回任何我喜欢的东西。
int port = 8080;
WireMockServer wireMockServer = new WireMockServer(new WireMockConfiguration().port(port).extensions(new ResponseTransformer() {
@Override
public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files) {
return new ResponseDefinitionBuilder().like(responseDefinition)
.withBody(request.getBodyAsString().getBytes())
.build();
}
@Override
public String name() {
return "request body returning request transformer";
}
}));
wireMockServer.start();
WireMock.configureFor("localhost", port);
stubFor(post(urlEqualTo("/encode"))
.willReturn(aResponse()
.withHeader("Content-Type", "application/octet-stream")
.withStatus(200)));
stubFor(post(urlEqualTo("/decode"))
.willReturn(aResponse()
.withHeader("Content-Type", "application/octet-stream")
.withStatus(200)));
Wiremock 支持您可以自己编写的扩展,这些扩展充当用于拦截请求和响应主体的中间件,因此您可以随意格式化它。它非常灵活,允许您动态地组成新的响应体,甚至根本不响应。
例如,我们在 Opentable 上为此编写了一个扩展,并在 Maven Central 上将其开源。它允许您将 json 属性视为变量并将它们插入到您的响应正文中。一探究竟。如果您有任何疑问,请告诉我们进展情况。 https://github.com/opentable/wiremock-body-transformer
据我所知以及我对 WireMock 的经验,没有。
您不能使用通过请求传递的参数来参数化响应。您能做的最好的事情是使用匹配器使您的模拟服务器做出相应的响应。
我建议您使用普通的 jUnit 进行一些单元或集成测试,以便在这种情况下测试请求/响应。如果您想测试收据请求是否正确响应,它们应该更快。我认为 WireMock 可以作为验收测试的替代方案,以确保您与其他 REST 服务的接口不会被破坏。
我从来没有使用过wiremock。但是根据他们的在线文档,您可以编写一个匹配 URL 和请求正文参数的模拟。因此,您应该能够根据 URL 本身或嵌入在请求正文中的参数返回不同的模拟。
是的,可以在wiremock中创建一个请求匹配的存根。请求匹配请求支持以下属性。
- 网址
- HTTP 方法
- 查询参数
- 标头
- 基本身份验证(标头匹配的一种特殊情况)
- 饼干
- 请求正文
- 多部分/表单数据
在您的场景中,如果您想对请求正文中的值应用匹配,您可以使用以下方法为其生成存根。
{
"request": {
...
"bodyPatterns" : [ {
"equalToJson" : "{ \"total_results\": 4 }"
} ]
...
},
...
}
点击链接了解更多详情:http ://wiremock.org/docs/request-matching/