Files
labtimesheet/docs/tests/unit/lombok-reporting-boilerplate.md
T

4.8 KiB

Test Evidence: Reporting Lombok boilerplate boundary

  • Test type: Unit
  • Requirement IDs: ARC-005, OPS-019, OPS-021
  • Scenario IDs: AC-OPS-002
  • Test class/method: Temporary executable source audit plus stable Reporting compile/behavior/architecture suites
  • Implementation commit: pending

Protected behavior

Reporting uses Lombok only for constructors that mechanically assign required Spring dependencies. Immutable dashboard DTOs remain records, the access-denied exception keeps its explicit superclass constructor, and the attendance-state presentation contract keeps its explicit fluent label() method.

Test method

The narrow source audit reads only the four Reporting production sources. It requires @RequiredArgsConstructor and removal of the two injection-only constructors while positively checking the deliberately retained records, exception constructor, and presentation method. A temporary JUnit source test established RED and passed GREEN, then was removed because retaining exact source-string assertions would couple the suite to implementation details. Existing unit, MockMvc, and architecture tests compile and exercise the generated constructor API.

Hand-derived expected result

DashboardController and DashboardService each contain final injected dependencies and constructors that only assign those fields, so both are eligible for @RequiredArgsConstructor. DashboardAccessDeniedException(String) must call its superclass and exposes a documented public error contract. The dashboard projections are already concise immutable records. AttendanceState.label() intentionally exposes a fluent presentation API rather than Lombok's default getLabel() shape.

RED

Command

export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="/opt/homebrew/opt/node@24/bin:$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=ReportingLombokBoilerplateTest test

Observed result

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
ReportingLombokBoilerplateTest failed because DashboardController did not contain
import lombok.RequiredArgsConstructor; and still had its handwritten injection constructor.
BUILD FAILURE
Total time: 4.638 s

GREEN

Command

export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="/opt/homebrew/opt/node@24/bin:$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=ReportingLombokBoilerplateTest test

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Total time: 4.528 s

test "$(rg -l '@RequiredArgsConstructor' \
  src/main/java/com/lab/labtimesheet/feature/reporting/controller/DashboardController.java \
  src/main/java/com/lab/labtimesheet/feature/reporting/service/DashboardService.java | wc -l | tr -d ' ')" = "2"
! rg -n 'public (DashboardController|DashboardService)\\(' \
  src/main/java/com/lab/labtimesheet/feature/reporting/controller/DashboardController.java \
  src/main/java/com/lab/labtimesheet/feature/reporting/service/DashboardService.java

Observed result

The temporary source audit passed 1/1 after both conversions. The final shell source audit exited 0: both eligible classes carry `@RequiredArgsConstructor`, and neither handwritten injection-only constructor remains.

Affected suite

Command and result

export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="/opt/homebrew/opt/node@24/bin:$JAVA_HOME/bin:$PATH"
export DOCKER_HOST=unix:///Users/sechmachine/.orbstack/run/docker.sock

./mvnw -Dtest=ReportingArchitectureTest,DashboardServiceTest,DashboardControllerWebTest test
Tests run: 13, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Total time: 5.952 s

./mvnw -Dtest=ReportingArchitectureTest,AccountTemplateIntegrationTest,AdminDashboardWebTest,AttendanceTemplateIntegrationTest,DashboardControllerWebTest,DashboardTemplateWebTest,ProjectTaskFormAccessibilityWebTest,ProjectTaskShellContractTest,RoleDashboardWebIntegrationTest,SharedErrorTemplateWebTest,DashboardServiceTest test
PostgreSQL 18.4 via Testcontainers
Tests run: 42, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Total time: 20.781 s

./mvnw -DskipTests compile
BUILD SUCCESS
Total time: 0.655 s

./mvnw -DskipTests -Ddoclint=all javadoc:javadoc
BUILD SUCCESS
Total time: 1.208 s

External-test boundaries

The source audit proves annotation scope and deliberate retention but does not alone prove generated bytecode, Spring injection, dashboard behavior, or Thymeleaf property access. Compile, Reporting service tests, MockMvc dashboard tests, architecture tests, PostgreSQL role-dashboard integration, and Javadoc/doclint provide those gates. Reporting owns no JPA entity or mutable bean, so JPA accessor/mapping checks are outside this feature's retrofit scope. Java 25 reports Lombok's known sun.misc.Unsafe annotation-processor warning, and Mockito reports its dynamic-agent warning; neither changed or failed the executed gates.