Priority: P0 (CRITICAL)
Core Rule Anchors
[BE-TEST-01]Parameterized Tests for Equivalent Cases: Prefer@ParameterizedTest(@CsvSource,@MethodSource) when methods have multiple equivalent inputs or boundary permutations. Distinct scenarios may stay separate test methods. Reviewers must not demand parameterized rewrites without a behavioral gap.[BE-TEST-02]Ban on Brittle DB Mock String Matching: Do not use string-matching mocks for raw SQL queries. Test pure domain calculations directly, or useTestcontainersfor database repository verification.[BE-TEST-03]Ban on Shallow Assertions: Never assert onlyassertThat(result).isNotNull()without inspecting domain fields, status codes, and invariants.[BE-TEST-04]Ban on Pass-Through Interface Mocks: Repositories and service handlers must test contract compliance and error mapping. Ban 1:1 pass-through mock echoing without contract assertions.[BE-TEST-05]Bug-First Regression Lock: Every PR fixing a bug ticket or with titlefix(...)must introduce a test reproducing the defect prior to the fix.
Follow TDD Workflow
- Red: Write failing test (e.g.,
returns 404) ([BE-TEST-05]). - Green: Implement minimal code to pass.
- Refactor: Clean up while keeping tests green (
[BE-TEST-01]). - Coverage: Diagnostic and project-configured; verify risk-weighted critical paths rather than padding code for an arbitrary percentage.
Write Slice and Integration Tests
- Real Infrastructure (
[BE-TEST-02]): Use Testcontainers for DB/Queues. Avoid H2/Embedded. - Assertions (
[BE-TEST-03]): Use AssertJ (assertThat) over JUnit assertions; avoid shallow checks. - Isolation (
[BE-TEST-04]): Use@MockBeanfor downstream dependencies in Slice Tests; avoid pass-through mock echoing.
See implementation examples for WebMvcTest slice tests and Testcontainers integration tests.
Anti-Patterns
[BE-TEST-01]Stylistic parameterized rewrites: Do not demand parameterized refactoring of passing tests without a behavioral gap.[BE-TEST-02]Brittle DB mock string matching: Do not match raw SQL strings in mocks; use Testcontainers.[BE-TEST-03]Shallow assertions: Never assert onlyassertThat(result).isNotNull()without inspecting domain fields or status codes.[BE-TEST-04]Pass-through mock echoing: Ban 1:1 pass-through mock echoing without contract assertions.[BE-TEST-05]Bug fix without reproduction test: Ban bug fixes without a regression test.- No Dirty Contexts: Avoid @MockBean in base classes; it reloads context per test.
- No network I/O in tests: Mock external calls with WireMock.
- No System.out in tests: Use AssertJ assertions instead.