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
機能比較表
| 比較項目 | WireMock | Mockoon | Prism |
|---|---|---|---|
| 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 |