9

我试图使用 Wiremock 独立服务器来实现 POST REST 调用的模拟。我面临这样的挑战,假设帖子正文包含一个“名称”字段及其值,则应该在该 POST 调用的响应中返回相同的值。我的 json 文件如下所示:

{
"priority": 1,
"request": {
    "method": "POST",
    "urlPath": "/primeSlots",
    "bodyPatterns" : [ {
        "matchesJsonPath" : "{ \"things\": [ { \"name\": \"794363\" }] 
 }"
    } ]
 },
 "response": {
    "status": 200,
    "body": "{{$.things.name.value}}",
    "transformers": ["response-template"]
 }
}

所以,我需要获取值,即 794363,但使用上述方法无法在响应后正文中获取它。

我也试过这个:

{
 "request": {
    "method": "POST",
    "urlPath": "/transform",
    "bodyPatterns": [
        {
            "matchesJsonPath" : "$.things[?(@.name =~ /[0-9]+/i)]"
        }
    ]
  },
  "response": {
    "status": 200,
    "body": "{\"responseName\": \"
   {{request.body.things.name.value}}\"}",
    "headers": {
        "Content-Type": "application/json"
    },
    "transformers": ["body-transformer"]
  }
 }

所以我的问题是,即使我使用与请求中的任何数字匹配的正则表达式,如何使用 Wiremock 独立 json 文件在响应中返回相同的数字?谢谢。

4

2 回答 2

2

今天我也遇到了和你一样的情况,找到了一个解决办法,想和大家分享一下:

  1. 创建自己的扩展类ResponseDefinitionTransformer
  2. 在您自己的转换器类中添加 Handlebar 功能(参见https://github.com/jknack/handlebars.java怎么做)
  3. (可选)附加您自己/其他帮助者,例如 Arrays.stream(StringHelpers.values()).forEach(helper -> this.handlebars.registerHelper(helper.name(), helper));
  4. 将您的变压器自定义导出为单独的 JAR 文件
  5. 创建一个启动批处理脚本以使用您自己的转换器扩展独立启动您的 WireMock,例如java -cp "-cp ".\lib\wiremock-standalone-2.5.1.jar;.\lib\customTransformer.jar" com.github.tomakehurst.wiremock.standalone.WireMockServerRunner --extensions "your.name.CustomTransformer"(对于 linux 使用:而不是;作为类路径分隔符)

如果您有多个转换器,只需在arg中定义所有使用 ,(逗号)作为分隔符的转换器。--extensions

于 2018-03-05T14:37:57.530 回答
2

不幸的是,WireMock 的响应模板转换器目前没有将请求正文分解为 Map,这对于您尝试做的事情是必要的。请求正文只是一个字符串。

启用此功能的最简单方法可能是编写实现 JSONPath 或其他一些用于查询 JSON 文档的机制的 Handlebars 助手,然后在初始化 WireMock 时将其注册到模板转换器。

在某个时候,我会编写handlebars helpers 来为XML 和JSON 做这种事情,但暂时不会。

于 2017-03-29T08:45:28.087 回答