【问题标题】:Wiremock Stand alone - How to manipulate response with request dataWiremock Standalone - 如何使用请求数据操作响应
【发布时间】:2017-08-21 18:56:02
【问题描述】:

我试图使用 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 文件在响应中返回相同的数字? 谢谢。

【问题讨论】:

    标签: java mocking stub wiremock


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,汤姆。 JKnack 在使用StringHelpers 创建 Handlebars 助手时为我们提供了一个很好的示例,但是在阅读WireMock Extension 上的文档时,很难理解两者之间的关系(特别是在独立运行时)。添加助手是否也需要新的 ResponseDefinitionTransformer?
    • 不,您不需要编写扩展程序。只需在代码中激活响应模板扩展并添加标准 Handlebars 帮助程序 (wiremock.org/docs/response-templating/#custom-helpers)。
    • 现在 WireMock 中有一个 Handlebars 助手,用于使用 JSONPath 查询 JSON 文档,因此不再需要编写自定义转换器/助手。
    • @Tom,我尝试在 stub.json 文件的 response.jsonBody 中使用"foo": "{{jsonPath request.body '$.outer'}}",但我得到了那个文字字符串;没有替代品。我错过了什么明显的东西吗?
    • @Alecz 我怀疑你在启动 WireMock 时忘记启用模板
    【解决方案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. 创建一个启动批处理脚本,以使用您自己的转换器扩展(例如java -cp "-cp ".\lib\wiremock-standalone-2.5.1.jar;.\lib\customTransformer.jar" com.github.tomakehurst.wiremock.standalone.WireMockServerRunner --extensions "your.name.CustomTransformer"(对于 linux 使用 : 而不是 ; 作为类路径分隔符)

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

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多