Java Testing Standards
Priority: P0 (CRITICAL)
High-reliability testing using JUnit 5 and fluent assertions.
Implementation Guidelines
- JUnit 5 (Jupiter): Use
@Test,@BeforeEach, and@AfterEach. Avoid JUnit 4 classes. - Fluent Assertions: Use
AssertJ (assertThat)over JUnitassertEquals— enhanced readability. - Naming: Use
MethodName_State_Resultor@DisplayName("Check if X when Y"). - Parameterized Tests: Use
@ParameterizedTestwith@ValueSource,@CsvSource, or@MethodSource. - Mocking Strategy: Use
Mockitowith@ExtendWith(MockitoExtension.class)(JUnit 5). Use@Mock,@Spy, and@InjectMocks. NEVER mock data-only Records. - Integration Testing: Use
Testcontainerswith@Containerannotation for real databases (PostgreSQL/Redis) in integration tests (*IT.java). - Isolation: Each test method MUST be isolated and independent; use
@DirtiesContextsparingly. - AssertJ Chaining: Chain assertions for clarity:
assertThat(result).isNotNull().hasSize(2).contains("X"). - Mocking verification: Use
verify(mock, times(1)).method()to audit side-effects. - Exceptions: Use
assertThatThrownBy(() -> ...)to verify specific Exception types and messages.
Anti-Patterns
- No Logic in Tests: Keep tests declarative; no loops or if/else branching.
- No System.out in Tests: Use assertions; never print to stdout.
- No Legacy Assertions: Use
assertThat(a).isEqualTo(b), notassertTrue(a == b). - No Shared State: Tests must be isolated and order-independent.