Skip to content
cccskills
FreePublished on GitHub

test-doubles-wiremock

Use when a test would otherwise call a real external dependency - replace it with WireMock or an equivalent stub so runs are deterministic, offline, and control the responses

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md3.5 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Test Doubles & WireMock

Overview

An automated test that calls a real third-party service (payment gateway, auth provider, partner API) is slow, flaky, costs money, and cannot exercise failure modes on demand. Replace those dependencies with a controllable stub — WireMock for HTTP — so the test owns every response.

Core principle: The system under test is real; its external dependencies are stubbed. You test YOUR code's behavior against controlled inputs, not the third party's uptime.

When to Use / When NOT

  • Stub: third-party/external HTTP services, payment/email/SMS providers, partner APIs, anything you don't own or that has side effects/cost.
  • Do NOT stub: the product's own API or the code under test — driving those for real is the whole point. And do not stub the database; use a real test database instead (see test-database-seeding) so SQL/dialect behavior is genuine.

WireMock Essentials

Run WireMock as a standalone server or a Testcontainers container; point the app's config for that dependency at its URL.

// stub: the auth provider returns a valid token for a known client
{
  "request":  { "method": "POST", "url": "/oauth/token" },
  "response": { "status": 200, "jsonBody": { "access_token": "test-token", "expires_in": 3600 } }
}

Model the failure paths too — that's the value a real service won't give you on demand:

Scenario to coverWireMock stub
Happy response200 + expected body
Upstream 5xx"status": 503 → assert your retry/fallback
Timeout"fixedDelayMilliseconds": 30000 → assert your timeout handling
Malformed body200 + garbage → assert you don't crash
Auth rejected401 → assert your error surfaces cleanly

Rules

  • Verify the request too, not just the canned response: assert the app called the dependency with the right method/path/body (WireMock verify). A stub that always returns 200 hides a broken request.
  • Reset stubs between tests so one test's mappings don't leak into another.
  • Match the contract exactly — stub the real endpoint's shape. A stub that diverges from reality passes tests but ships integration bugs; keep it aligned with the provider's documented contract.
  • Prefer per-test stubs over one giant global mapping file — tests stay readable and independent.

Worked Example

Checkout calls an external payment API. To test "payment declined shows an error and does not create an order":

  1. WireMock stub: POST /charge → 402 {"error":"declined"}.
  2. Drive the real checkout flow against it.
  3. Assert: user sees the decline message, no order row was created, and WireMock recorded exactly one POST /charge with the expected amount.

No real card, no real gateway, and the decline path is tested every run.

Common Mistakes

  • Stubbing your own API (you're no longer testing it).
  • Stubbing the database (use a real test DB).
  • A stub that returns 200 for everything → false green.
  • Never asserting the outgoing request → a broken payload passes.
  • Global stubs leaking across tests.

Red Flags

  • A test hits a real external URL → network flake and cost incoming.
  • Only the happy response is stubbed; no failure-mode coverage.
  • The stub shape drifted from the provider's real contract.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here

The English summary is being prepared. Showing the original description.

makifbaysal/tasktrooper118Updated Oct 21, 2026

See all skills by makifbaysal

Report a problem with this skill