読者です 読者をやめる 読者になる 読者になる

覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。 twitter: @yyoshikaw

続・stubby4j

HTTPのモックサーバを立てる際に使用する stubby4j の利用サンプルです。
本記事は「はじめてのstubby4j」の続きです

以下に示す各種サンプルは、サンプルの構成に定義された状況で実行しています


YAMLファイルにレスポンスのJSONを直接記述

YAMLファイルに記述したレスポンスBodyの内容が応答されます

  • YAMLでの定義例
# YAMLファイルにレスポンスのJSONを直接書く例
-  request:
      method: [GET]
      url: /SampleServer/json1

   response:
      status: 200
      headers:
         content-type: application/json; charset=UTF-8
      body: >
         {
           "id": 1001,
           "name": "Yamada Tarako",
           "age": 25,
           "remarks": "test user."
         }
  • リクエスト

http://localhost:8882/SampleServer/json1

  • レスポンス
{
  "id": 1001,
  "name": "Yamada Tarako",
  "age": 25,
  "remarks": "test user."
}


応答を遅延させる

リクエストを受けてからレスポンスを返すまでを遅延させることができます。
遅延時間を「latency」の項目で指定します

  • YAMLでの定義例
# レスポンスを(10秒)遅らせる
-  request:
      method: [GET]
      url: /SampleServer/slowresponse

   response:
      latency: 10000 # 単位=ミリ秒
      body: Hello, Slow Response!
  • リクエスト

http://localhost:8882/SampleServer/slowresponse

  • レスポンス

10秒後に以下のレスポンスが返ります

Hello, Slow Response!


リクエストのURLの一部やqueryパラメータをレスポンスに含める

リクエストのURLの一部やqueryパラメータを正規表現で受け取ることができます。
受け取った値をレスポンスに含めることができます。

  • YAMLでの定義例
# リクエストのURLの一部やqueryパラメータをレスポンスに含める
# accountのidとcatecoryの名前をURLから取得し、queryパラメータから日付を取得
-  request:
      method: [GET]
      url: ^/account/(\d{5})/category/([a-zA-Z]+)
      query:
         date: "([a-zA-Z0-9]+)"

   response:
      status: 200
      headers:
         content-type: application/json; charset=UTF-8
      body: >
         {
           account_id: <% url.1 %>,
           category: "<% url.2 %>",
           date: "<% query.date.1 %>"
         }
  • リクエスト

http://localhost:8882/account/12345/category/books?date=20160201

  • レスポンス

レスポンス内容はリクエストに応じて動的に変化します

{
  account_id: 12345,
  category: "books",
  date: "20160201"
}


URLに応じてレスポンスの内容を変更する

リクエストのURLに応じてレスポンス用のファイルを切り替えることができます。
以下例では、URLにより応答するHTMLファイル名を決定しています。

  • YAMLでの定義例
# URLに応じてレスポンスのhtmlファイルを切り替える
-  request:
      method: [GET]
      url: ^/SampleServer/([a-z]+).html

   response:
      status: 200
      file: ../html/<% url.1 %>.html
  • リクエスト/レスポンス(1)

http://localhost:8882/SampleServer/hello.html

Hello, World!
  • リクエスト/レスポンス (2)

http://localhost:8882/SampleServer/goodbye.html

Bye, World!


queryパラメータに応じてレスポンスの内容を変更する

リクエストのqueryパラメータに応じてにレスポンス用のファイルを切り替えることができます。
以下例では、2つのqueryパラメータにより応答するJSONファイル名を決定しています。

  • YAMLでの定義例
# queryパラメータに応じてレスポンスのjsonファイルを切り替える
-  request:
      method: [GET]
      url: ^/SampleServer/json/dynamic
      query:
         param1: "([a-zA-Z0-9]+)"
         param2: "([a-zA-Z0-9]+)"
   response:
      headers:
         content-type: application/json; charset=UTF-8
      status: 200
      file: ../json/<% query.param1.1 %>-<% query.param2.1 %>.json
  • リクエスト/レスポンス(1)

http://localhost:8882/SampleServer/json/dynamic?param1=person&param2=1

{
    id: 100,
    name: "Yamada Taro"
}
  • リクエスト/レスポンス (2)

http://localhost:8882/SampleServer/json/dynamic?param1=book&param2=1

{
    id: 105,
    title: "Java vs Godzilla",
    description: "Love Story"
}
  • リクエスト/レスポンス (3)

http://localhost:8882/SampleServer/json/dynamic?param1=book&param2=2

{
    id: 109876,
    title: "Stubby4j in USJ",
    description: "Technical book"
}



サンプルの構成

上記の各種サンプルは以下の構成で実行しました

ディレクトリ構成

/
│
├─html
│      hello.html
│      goodbye.html
│
├─json
│      person-1.json
│      person-2.json
│      book-1.json
│      book-2.json
│
└─server
      Sample.yml
       stubby4j-3.3.0.jar

YAMLファイルの中身

Sample.ymlに定義した内容

# YAMLファイルにレスポンスのJSONを直接書く例
-  request:
      method: [GET]
      url: /SampleServer/json1

   response:
      status: 200
      headers:
         content-type: application/json; charset=UTF-8
      body: >
         {
           "id": 1001,
           "name": "Yamada Tarako",
           "age": 25,
           "remarks": "test user."
         }

# レスポンスを(10秒)遅らせる
-  request:
      method: [GET]
      url: /SampleServer/slowresponse

   response:
      latency: 10000 # 単位=ミリ秒
      body: Hello, Slow Response!


# リクエストのURLの一部やqueryパラメータをレスポンスに含める
-  request:
      method: [GET]
      url: ^/account/(\d{5})/category/([a-zA-Z]+)
      query:
         date: "([a-zA-Z0-9]+)"

   response:
      status: 200
      headers:
         content-type: application/json; charset=UTF-8
      body: >
         {
           account_id: <% url.1 %>,
           category: "<% url.2 %>",
           date: "<% query.date.1 %>"
         }

# URLに応じてレスポンスのhtmlファイルを切り替える
-  request:
      method: [GET]
      url: ^/SampleServer/([a-z]+).html

   response:
      status: 200
      file: ../html/<% url.1 %>.html

# queryパラメータに応じてレスポンスのjsonファイルを切り替える
-  request:
      method: [GET]
      url: ^/SampleServer/json/dynamic
      query:
         param1: "([a-zA-Z0-9]+)"
         param2: "([a-zA-Z0-9]+)"
   response:
      headers:
         content-type: application/json; charset=UTF-8
      status: 200
      file: ../json/<% query.param1.1 %>-<% query.param2.1 %>.json

レスポンスファイルの中身

  • hello.html
<html>
    <head>
       <title>Title - Hello</title>
   </head>
    <body>Hello, World!</body>
</html>
  • goodbye.html
<html>
    <head>
       <title>Title - Bye</title>
   </head>
    <body>Bye, World!</body>
</html>
  • person-1.json
{
    id: 100,
    name: "Yamada Taro"
}
  • person-2.json
{
    id: 235,
    name: "Sato Hanako"
}
  • book-1.json
{
    id: 105,
    title: "Java vs Godzilla",
    description: "Love Story"
}
  • book-2.json
{
    id: 109876,
    title: "Stubby4j in USJ",
    description: "Technical book"
}



関連エントリ