1

我正在尝试使用 Wiremock 进行存根,以根据发布请求中发送的正文提供响应。

例如,发送这个 json 时:

{
    "person": {
        "firstName": "paul",
        "age": "50"
    }
}

我想发送 pauldata.json

这是我的请求/响应 json 下面:

{
  "request": {
    "method": "POST",
    "url": "/api/test1",
    "bodyPatterns": [
      {
        "matchesJsonPath": "$.person[?(@.firstName=='paul')]"
      }
    ]
  },
  "response": {
    "status": 200,
    "bodyFileName": "pauldata.json",
    "headers": {
      "Content-Type": "application/json"
    }
  }
}

但是,这会导致错误:

JSON 路径表达式 '$.person[?(@.firstName=='paul')]' 无法匹配文档,因为错误 'net.minidev.json.JSONObject cannot be cast to java.util.List

此表达式: $.person[?(@.firstName=='paul')] 将 json 与http://jsonpath.herokuapp.com/上的 Jayway 实现匹配,但与 Wiremock 使用的 Goessner 实现不匹配。

我注意到,如果我只是在 jayway 中执行 $.person.firstName,它会返回“paul”,但是当我在 Goessner 中执行相同的操作时,我会得到 [“paul”]。

如何使用 JSONPath 的 Goessner 实现匹配键的值,以便可以根据数据中键的值返回自定义 json?

4

1 回答 1

3

WireMock 不接受所有 JSONPath 表达式,尽管它们确实在在线测试器中工作。我遇到了同样的问题,并使用以下方法解决了它:

{
  "request": {
    "method": "POST",
    "url": "/api/test1",
    "bodyPatterns": [
      {
        "matchesJsonPath": "$..[?(@.firstName=='paul')]"
      }
    ]
  },
  "response": {
    "status": 200,
    "bodyFileName": "pauldata.json",
    "headers": {
      "Content-Type": "application/json"
    }
  }
}

唯一改变的是:

$.person[?(@.firstName=='paul')]

到:

$..[?(@.firstName=='paul')]

这是因为 .. 符号递归地搜索所有输入。

如果您需要查询根元素,即没有父元素的根元素,则使用相同的 JSONPath。例如,假设您有另一个元素,如下所示:

{
    "person": {
        "firstName": "paul",
        "age": "50"
    },
    "test": "true"
}

如果你想匹配 "test": "true" 你需要 JSONPath 如下:

$..[?(@.test=='true')]

我在我的 WireMock 中测试了所有东西,所以它应该可以工作。

于 2015-08-11T15:47:52.653 回答