4.9 KiB
Test Evidence: Attendance targeted Lombok boilerplate retrofit
- Test type: Unit compiled-contract audit
- Requirement IDs:
ATT-001–ATT-012,CAL-001,CAL-006–CAL-009 - Scenario IDs:
AC-ATT-001–AC-ATT-005,AC-CAL-003,AC-CAL-004 - Test class/method:
com.lab.labtimesheet.feature.attendance.AttendanceLombokBoilerplateTest#generatedConstructorsPreserveParameterListsAndVisibility,com.lab.labtimesheet.feature.attendance.AttendanceLombokBoilerplateTest#immutableModelsRemainRecordsWithTheirComponentContracts,com.lab.labtimesheet.feature.attendance.AttendanceLombokBoilerplateTest#entitiesExposeOnlyIntentionalPublicAndProtectedDeclaredMethods,com.lab.labtimesheet.feature.attendance.AttendanceLombokBoilerplateTest#componentsExposeOnlyIntentionalPublicAndProtectedDeclaredMethods - Implementation commit:
82ad8202fd31f77db8c3932a902dba07cee70894
Protected behavior
Attendance uses the installed Lombok processor only for mechanical constructors while preserving the compiled API: package-level Spring injection, protected JPA construction, immutable record components, domain constructors and mutations, raw punch and attached-policy history rules, composite-key identity, and existing public method names.
Test method
Reflection inspects compiled feature.attendance classes rather than source spelling. It verifies every constructor's
parameter order and modifier, every immutable model's record components, and the exact public/protected declared method
surface of each Attendance entity. The entity surface prevents generated bean getters/setters or entity
equals/hashCode/toString widening while explicitly retaining AttendanceRecordEntity#setCheckOutAt and the
LeaveRequestDayId identity methods. Exact controller and service surfaces likewise prevent Lombok from exposing
collaborator getters/setters or generated equals/hashCode/toString methods.
Hand-derived expected result
Five injection-only components expose only their package-scoped dependency constructors. Six JPA/embeddable types
retain protected no-argument construction alongside their intentional domain constructors, and the stateless domain
service remains package-scoped. Seven immutable models remain records with the same component order and types. Entity
method surfaces contain only intentional domain conversion/access/mutation methods; only the composite key owns
equals and hashCode, and no Attendance entity declares toString. Both controllers and all four Attendance
services expose only their existing route or application/domain operations, never their injected collaborators.
RED
Command
export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=AttendanceLombokBoilerplateTest test
Observed result
Tests run: 3, Failures: 2, Errors: 0, Skipped: 0
The initial source audit first failed on AttendanceController because its mechanical dependency constructor remained,
and on AttendancePolicyEntity because its mechanical protected JPA constructor remained. The immutable-record and
business-method retention guard passed. After this RED established the retrofit gap, the permanent regression was
replaced with compiled reflection/API checks so formatting or annotation spelling cannot affect the result.
BUILD FAILURE
Process exited 1.
GREEN
Command
export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=AttendanceLombokBoilerplateTest test
Observed result
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
Process exited 0.
Affected suite
Command and result
export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="$JAVA_HOME/bin:$PATH"
export DOCKER_HOST=unix:///Users/sechmachine/.orbstack/run/docker.sock
./mvnw -Dtest='*Attendance*Test' test
Tests run: 39, Failures: 0, Errors: 0, Skipped: 0
PostgreSQL 18.4 started and Flyway applied V1 for the persistence and concurrency contexts.
BUILD SUCCESS
Process exited 0.
External-test boundaries
The reflection audit does not replace Spring/JPA bootstrapping, MVC property access, PostgreSQL persistence, or Javadoc/doclint. Those checks remain affected verification. No application behavior or public API is intentionally changed by this retrofit.
Additional verification on the same source tree:
./mvnw -DskipTests compile
BUILD SUCCESS
./mvnw -q -DskipTests compile dependency:build-classpath -Dmdep.outputFile=target/attendance-javadoc-classpath.txt
javadoc -quiet -Xdoclint:all -d target/attendance-javadocs -classpath "target/classes:$(tr -d '\n' < target/attendance-javadoc-classpath.txt)" -sourcepath src/main/java -subpackages com.lab.labtimesheet.feature.attendance
Process exited 0. The source frontend reported seven generated-constructor missing-comment warnings because it does not
expand Lombok constructors; repository policy exempts generated trivial constructors from duplicate Javadoc.