AI

APIモックツール比較:WireMock vs Mockoon vs Prism でサービスを仮想化する

オープンソースラボ編集部2026年6月14日

APIモックツール比較:WireMock vs Mockoon vs Prism でサービスを仮想化する

マイクロサービス開発・テスト・フロントエンド開発では、バックエンドAPIが未完成の段階でも開発を進めるために**APIモック(サービス仮想化)**が必要です。WireMock(Java製・Dockerサポート・高機能)・Mockoon(デスクトップUI・手軽)・Prism(OpenAPI駆動・スキーマ検証)の3つがOSSモックツールのデファクトスタンダードです。

APIモックツールが必要な場面

  • フロントエンド先行開発: バックエンドAPIが未完成でもUI開発を進める
  • テスト安定化: 外部API(Stripe・Slack・SendGrid)への実際のリクエストをモックに差し替えてテストをフレーキーにしない
  • 障害シミュレーション: レスポンス遅延・500エラー・タイムアウトを意図的に注入して負荷テスト・障害テストを実施
  • コスト削減: 外部API(SMS・メール・AI API)の開発中リクエストをゼロコストのモックで代替

主要ツールの概要

WireMock

2012年公開、Java製のOSSです。GitHubスター6k+。最もフル機能なAPIモックツールで、Dockerコンテナとして動かしてCI/CDパイプラインに組み込む使い方が一般的です。JSONスタブ定義・Jinja2テンプレートレスポンス・リクエストマッチング(正規表現・XPath・JSONPath)・シナリオ(ステートマシン)・レコード&リプレイ機能を搭載しています。

# docker-compose.yml - WireMock スタンドアロンサーバー
version: "3.8"
services:
  wiremock:
    image: wiremock/wiremock:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "8443:8443"
    volumes:
      - ./wiremock/mappings:/home/wiremock/mappings
      - ./wiremock/files:/home/wiremock/__files
    command:
      - --verbose
      - --global-response-templating
      - --disable-request-journal=false
      - --max-request-journal=1000

  # 複数のサービスをモックする場合
  payment-service-mock:
    image: wiremock/wiremock:latest
    ports:
      - "8081:8080"
    volumes:
      - ./wiremock/payment:/home/wiremock/mappings
    command: --verbose --global-response-templating

  notification-service-mock:
    image: wiremock/wiremock:latest
    ports:
      - "8082:8080"
    volumes:
      - ./wiremock/notification:/home/wiremock/mappings
// wiremock/mappings/users-api.json
// ユーザーAPIのモックスタブ定義
{
  "mappings": [
    {
      "name": "GET /users - ユーザー一覧",
      "request": {
        "method": "GET",
        "urlPathPattern": "/api/v1/users",
        "queryParameters": {
          "page": { "matches": "\d+" },
          "limit": { "matches": "\d+" }
        }
      },
      "response": {
        "status": 200,
        "headers": { "Content-Type": "application/json" },
        "jsonBody": {
          "data": [
            { "id": "usr_001", "name": "山田太郎", "email": "yamada@example.com", "plan": "pro" },
            { "id": "usr_002", "name": "佐藤花子", "email": "sato@example.com", "plan": "free" }
          ],
          "pagination": { "page": 1, "limit": 20, "total": 2 }
        }
      }
    },
    {
      "name": "POST /users - ユーザー作成(動的レスポンス)",
      "request": {
        "method": "POST",
        "urlPath": "/api/v1/users",
        "headers": { "Content-Type": { "contains": "application/json" } }
      },
      "response": {
        "status": 201,
        "headers": { "Content-Type": "application/json" },
        "jsonBody": {
          "id": "{{randomValue type='UUID'}}",
          "name": "{{jsonPath request.body '$.name'}}",
          "email": "{{jsonPath request.body '$.email'}}",
          "created_at": "{{now format='yyyy-MM-dd HH:mm:ss'}}",
          "status": "active"
        },
        "transformers": ["response-template"]
      }
    },
    {
      "name": "GET /users/:id - 404シミュレーション",
      "request": {
        "method": "GET",
        "urlPathPattern": "/api/v1/users/not-found-.*"
      },
      "response": {
        "status": 404,
        "jsonBody": {
          "error": "NOT_FOUND",
          "message": "User not found",
          "code": 404
        }
      }
    },
    {
      "name": "POST /payments - 遅延レスポンス(タイムアウトテスト用)",
      "request": {
        "method": "POST",
        "urlPath": "/api/v1/payments"
      },
      "response": {
        "status": 200,
        "fixedDelayMilliseconds": 5000,
        "jsonBody": { "status": "pending", "transaction_id": "txn_slow_001" }
      }
    }
  ]
}
# Python: WireMock Admin APIでスタブを動的に管理
import requests
import json

WIREMOCK_URL = 'http://localhost:8080'

def reset_stubs():
    '''全スタブをリセット(テスト前に呼ぶ)'''
    requests.post(f'{WIREMOCK_URL}/__admin/reset')
    print('スタブをリセットしました')

def add_stub(stub_definition: dict) -> str:
    '''スタブを動的に追加して stub_id を返す'''
    resp = requests.post(
        f'{WIREMOCK_URL}/__admin/mappings',
        json=stub_definition,
    )
    resp.raise_for_status()
    return resp.json()['id']

def get_request_log() -> list:
    '''受信したリクエストのログを取得'''
    resp = requests.get(f'{WIREMOCK_URL}/__admin/requests')
    return resp.json()['requests']

def verify_called(url_pattern: str, expected_count: int = 1):
    '''特定のURLへのリクエスト回数を検証'''
    resp = requests.post(
        f'{WIREMOCK_URL}/__admin/requests/count',
        json={'urlPathPattern': url_pattern}
    )
    count = resp.json()['count']
    assert count == expected_count, f'Expected {expected_count} calls to {url_pattern}, got {count}'
    print(f'✓ {url_pattern} が{count}回呼ばれました')

# テスト例
reset_stubs()
stub_id = add_stub({
    'request': {'method': 'POST', 'urlPath': '/api/webhooks/stripe'},
    'response': {'status': 200, 'jsonBody': {'received': True}}
})
print(f'Stripeウェブフックスタブ追加: {stub_id}')
# ... テスト実行後 ...
verify_called('/api/webhooks/stripe', expected_count=1)

Mockoon

2019年公開、TypeScript製のOSSです。GitHubスター6k+。デスクトップGUIアプリでAPIモックを定義してすぐに起動できるツールです。Electron製のGUIとCLI(mockoon-cli)の両方で利用でき、JSON設定ファイルをエクスポートしてチームで共有できます。

# Mockoon CLI のインストールとDocker利用
npm install -g @mockoon/cli

# ローカルJSON設定ファイルからモックサーバー起動
mockoon-cli start --data ./mockoon-env.json --port 3001

# Dockerで起動(CI/CD向け)
docker run -d   --name mockoon   -p 3001:3001   -v $(pwd)/mockoon-env.json:/data/data.json   mockoon/mockoon-cli:latest   --data /data/data.json --port 3001
// mockoon-env.json の構造例(Mockoon CLIに渡すJSON設定)
{
  "uuid": "mock-env-001",
  "name": "Product API Mock",
  "port": 3001,
  "routes": [
    {
      "method": "get",
      "endpoint": "products",
      "responses": [
        {
          "statusCode": 200,
          "label": "商品一覧",
          "headers": [{ "key": "Content-Type", "value": "application/json" }],
          "body": "[{"id": 1, "name": "ノートPC", "price": 99800}, {"id": 2, "name": "マウス", "price": 3980}]",
          "default": true
        }
      ]
    }
  ]
}

Prism (Stoplight)

2019年公開、TypeScript製のOSSです。GitHubスター4k+。OpenAPI(Swagger)仕様書を読み込んでリクエスト/レスポンスの検証とモックを自動生成するツールです。API仕様書がある場合、スタブ定義ファイルを書かずに即座にモックサーバーを起動できます。

# Prism インストールと起動
npm install -g @stoplight/prism-cli

# OpenAPI仕様書からモックサーバーを起動
prism mock openapi.yaml

# リモートのOpenAPI仕様書からモック
prism mock https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/examples/v3.0/petstore.yaml

# ダイナミックモード(毎回異なるダミーデータを生成)
prism mock openapi.yaml --dynamic

# バリデーションモード(リクエスト/レスポンスをスキーマで検証)
prism proxy http://api.yourdomain.com openapi.yaml
# openapi.yaml の例(Prismが読み込むOpenAPI仕様書)
openapi: 3.0.3
info:
  title: Users API
  version: 1.0.0
paths:
  /users:
    get:
      summary: ユーザー一覧取得
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            minimum: 1
            default: 1
      responses:
        '200':
          description: ユーザー一覧
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
              examples:
                default:
                  value:
                    data:
                      - id: usr_001
                        name: 山田太郎
                        email: yamada@example.com
    post:
      summary: ユーザー作成
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserRequest'
      responses:
        '201':
          description: 作成成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
components:
  schemas:
    User:
      type: object
      required: [id, name, email]
      properties:
        id:
          type: string
          example: usr_001
        name:
          type: string
          example: 山田太郎
        email:
          type: string
          format: email
    CreateUserRequest:
      type: object
      required: [name, email]
      properties:
        name:
          type: string
          minLength: 1
        email:
          type: string
          format: email

機能比較表

比較項目WireMockMockoonPrism
OpenAPI連携△(要変換)✅(自動生成)
GUI操作✅(デスクトップ)
障害注入
リクエスト検証
Docker対応
学習コスト

APIモックはDevOpsカテゴリ/categories/devopsのCI/CDパイプライン(GitHub Actions・GitLab CI)に組み込んで外部依存のないインテグレーションテストを実現します。セキュリティカテゴリ/categories/securityの脆弱性スキャン・API仕様書検証(OWASP APIセキュリティTop 10チェック)にもPrismのプロキシモードが活用できます。

FAQ

Q. WireMockとMockoonはどう使い分けますか?

A. CI/CDパイプライン・複雑な条件分岐・障害注入が必要ならWireMockチームで手軽にAPI仕様を共有・プロトタイプ確認ならMockoonが向いています。WireMockの選択基準: ①Docker Composeでテスト環境に組み込みたい②リクエストの検証回数カウント(呼ばれたか確認)が必要③Jinja2テンプレートでリクエストの値を動的にレスポンスに埋め込みたい④シナリオ(カートに追加→在庫変動→在庫切れ)のステートマシンをシミュレーションしたい。Mockoonの選択基準: ①デスクトップGUIでエンジニア以外もスタブを編集したい②フロントエンド開発者が自分のPCで素早くモックを立ち上げたい③OpenAPI仕様書はないがJSON設定をGitで管理したい。

Q. Prismでリクエストのバリデーションを行うにはどうしますか?

A. Prismのプロキシモード(prism proxy)を使用します。prism proxy http://api.backend:8000 openapi.yamlで起動すると、フロントエンドからのリクエストをPrismが受け取りOpenAPI仕様書と照合してバリデーション後に本物のバックエンドに転送します。バリデーションエラー(スキーマ違反・必須フィールド欠如・型不一致)はコンソールと返却するHTTPレスポンスヘッダー(sl-violations)で詳細を確認できます。CI環境ではprism mock openapi.yamlでモックモードのみ使いバリデーションは単体テストで実施するのが一般的です。

Q. GitHub ActionsでWireMockをサービスとして使う方法は?

A. serviceコンテナ機能を使ってWireMockをサイドカーとして起動します。GitHub Actionsのservicesブロックにimage: wiremock/wiremock:latestを定義してmappingsをボリュームマウントします。ただしGitHub ActionsのサービスコンテナはLinuxランナーでのみ動作するためWindowsランナーでは使えません(代替: docker run -dでコマンドから起動)。起動確認はuntil curl -s http://localhost:8080/__admin/health; do sleep 1; doneでヘルスチェックを実施します。

Q. 本番環境のAPIをWireMockでレコードして再生する方法は?

A. WireMockのRecord & Replay機能を使います。① --record-mappingsオプションを付けてWireMockを起動②クライアント(アプリ・テスト)がWireMock経由で本番APIにリクエスト③WireMockが自動的にmappings/にスタブJSONを生成④--playback-onlyモードに切り替えてオフラインで再利用。Admin APIでも操作可能: POST /__admin/recordings/start({targetBaseUrl: "https://api.stripe.com"})→ リクエスト実行 → POST /__admin/recordings/stop。注意: APIキーやトークンを含むレスポンスはGitにコミットしないよう.gitignoreでmappings/を除外してください。

まとめ

ユースケース推奨ツール
CI/CD統合・障害注入・高機能モックWireMock
チームでGUI共有・手軽なプロトタイプ確認Mockoon
OpenAPI仕様書駆動・スキーマ検証Prism

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。