Summary
Spring Boot 4.0.0 bundles a newer version of JUnit 5 that expects the method
ExtensionContext$Store.computeIfAbsent(Object, Function, Class).
When you force JUnit 5.10.2 (or any version that does not contain that overload) the runtime classpath lacks the method, resulting in a NoSuchMethodError during the SpringExtension initialization.
Root Cause
- Spring Boot 4.0.0 declares a minimum JUnit 5.10.3 version that implements the three‑argument
computeIfAbsent. - You override the version to 5.10.2, which only provides the two‑argument overload.
- The test‑container dependencies also bring in older JUnit artifacts, creating a mixed classpath.
Why This Happens in Real Systems
- Version alignment: Spring Boot’s starters manage transitive test dependencies; manual overrides easily break the alignment.
- Method signature changes: Adding a new overload is a binary‑compatible change only for callers compiled against the newer API.
- Maven’s “nearest‑definition” rule: The version you declare in your
<dependencies>wins over the one brought transitively, even if it’s older.
Real-World Impact
- Test suite crashes before any test code runs, hiding functional failures.
- CI pipelines fail, causing rollbacks or hot‑fixes under pressure.
- Developers waste time debugging what looks like a mysterious runtime error rather than a simple version mismatch.
Example or Code (if necessary and relevant)
5.10.3
org.junit.jupiter
junit-jupiter
${junit-jupiter.version}
test
How Senior Engineers Fix It
- Align with Spring Boot’s BOM: Remove any explicit JUnit version and rely on the parent’s dependency management.
- Upgrade to a supported Spring Boot release (e.g., 4.0.5) if you need the latest bug fixes, keeping the BOM version in sync.
- Run
mvn dependency:tree -Dincludes=junitto verify there is only one JUnit version on the test classpath. - Add a clear comment in the
pom.xmlexplaining why the version is not overridden, preventing future accidental changes.
Why Juniors Miss It
- They often think “newer is better” and downgrade a library to match a known version without checking compatibility.
- Lack of familiarity with Spring Boot’s dependency management and the importance of the BOM.
- Tendency to search for the missing method in their own code rather than inspecting the classpath.