如何在 wiremock 中将响应写为带有列表的模板?

How to write response in wiremock as a template with list?

我想在 wiremock 中使用模板响应并将列表设置为参数。怎么做?

我在 Java 中设置了 wiremock:

wireMockServer.stubFor(get(urlPathEqualTo("/somePath"))
            .withQueryParam("place.id", equalTo(buildingId))
            .willReturn(aResponse()
                .withHeader("Content-Type", "application/json")
                .withBodyFile("wiremock/response-template.json") //how to set up this file
                .withTransformerParameters(Map.of(
                    "place", "New York",
                    "users", List.of(new User("John", 24), new User("Merry", 31)) //list to insert
                 ))
                .withTransformers("response-template")));

如何编写文件:response-template.json 得到这样的结果:

{
  "place": "New York",
  "users": [
    {
      "name": "John",
      "age": 24
    },
    {
      "name": "Marry",
      "age": 31
    }
  ]
}

我知道它应该这样开始:

{
  "place": "{{parameters.place}}",
  "users": [
    ???
  ]
}

最简单的解决方案是使用 Jackson2 Helper 或任何其他可以序列化为 json 的助手。

  1. Handlebars jackson2 依赖项添加到您的项目:
  • Gradle
testImplementation 'com.github.jknack:handlebars-jackson2:4.3.0'
  • 行家
<!-- https://mvnrepository.com/artifact/com.github.jknack/handlebars-jackson2 -->
<dependency>
    <groupId>com.github.jknack</groupId>
    <artifactId>handlebars-jackson2</artifactId>
    <version>4.3.0</version>
    <scope>test</scope>
</dependency>
  1. 使用您的 wiremock 实例注册处理程序:
WireMockServer wireMockServer = new WireMockServer(wireMockConfig().dynamicPort()
                .extensions(new ResponseTemplateTransformer(false, "json", Jackson2Helper.INSTANCE)))

助手的名称将是 json,这就是您在模板中引用它的方式。

  1. 在您的模板中使用它:
{
  "place": "{{parameters.place}}",
  "users": {{json parameters.users}}
}
  1. 输出为:
{
  "place": "New York",
  "users": [{"name":"John","age":24},{"name":"Merry","age":31}]
}

当然,您可以自定义 Jackson2Helper 并使用自己的 ObjectMapper 实例创建自己的实例 - 如果您使用 Spring 并希望在所有地方使用相同的序列化选项,这将非常有用。