| Writing tests after code | Tests adapt to bugs instead of specifying behavior |
| Testing mock behavior | Tests the wiring, not the outcome |
| Adding test-only methods | Design is wrong — refactor the public API |
| Keeping pre-written code | Delete it, write the test, rewrite the code |
| Hidden dependency construction | Can't control it in tests — add an explicit seam |
| Mocking everything | Low-fidelity and brittle. Prefer real/fake/stub when feasible |
| Mocking the system under test | Tests the mock setup, not behavior |
| Asserting internal call sequences | Couples tests to implementation; breaks on harmless refactors |
| Interface per dependency by default | Adds ceremony without improving test value |
| Complex mock setup | Usually means a fake or higher-level test is better |