What problem does it solve? Confusing stubs with mocks leads to over-specified, brittle tests, and mocking managed dependencies like your own database hides real SQL and transaction bugs. This Skill clarifies the five test double roles (dummy, stub, mock, spy, fake) and shows when to verify real middleware with Testcontainers instead of mocks. ## Core Features & Use Cases - Five-type classification: Distinguishes dummies, stubs, mocks, spies, and fakes by role, enforcing the rule that stubs supply input without verification while mocks verify outgoing calls. - Dependency-based assignment: Maps each collaborator to a double by dependency type (unmanaged out-of-process, managed out-of-process, in-process) with step-by-step procedures and completion checklists. - Testcontainers guidance: Shows how to run real databases like PostgreSQL in disposable containers for integration tests, with vitest TypeScript examples and lifecycle management. - Use Case: When writing a test for a pricing service that calls an exchange-rate API and an audit log, assign a stub for the rate input, a mock for the audit output, and verify each with the correct assertion style. ## Quick Start Ask the AI to review your test file and classify each test double as dummy, stub, mock, spy, or fake, flagging any stub that has call verification attached.