web-dev-qa-db-ja.com

Wiremockスタンドアロン-リクエストデータを使用して応答を操作する方法

POST REST WiremockStandaloneサーバーを使用して呼び出しのモックを実装しようとしました。このような課題に直面しています。投稿の本文に「名前」が含まれているとします。 "フィールドとその値、その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ファイルを使用して応答で同じ番号を返す方法はありますか?ありがとう。

7
Sam

残念ながら、WireMockの応答テンプレートトランスフォーマーは、現在、実行しようとしていることに必要なように、リクエストの本文をマップに分割していません。リクエストの本文は1つの文字列です。

これを有効にする最も簡単な方法は、JSONPathまたはJSONドキュメントをクエリするための他のメカニズムを実装するHandlebarsヘルパーを作成し、WireMockを初期化するときにこれをテンプレートトランスフォーマーに登録することです。

ある時点で、XMLとJSONに対してこの種のことを行うためのハンドルバーヘルパーを作成しますが、それはしばらくの間はありません。

2
Tom

今日、私はあなたと同じ状況にあり、あなたと共有したい解決策を見つけました:

  1. ResponseDefinitionTransformerを拡張する独自のクラスを作成します
  2. 独自のトランスフォーマークラスにハンドルバー機能を追加します( 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の場合、クラスパス区切り文字として:の代わりに;を使用します)

複数のトランスフォーマーがある場合は、,(コンマ)を--extensions引数の区切り文字として使用してすべてのトランスフォーマーを定義するだけです。

1
pitschr