add ADRs for gradle and spring boot version and version smoke-tests
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
# Spring Boot Version
|
||||
|
||||
**Status:**
|
||||
- proposed: 2026-06-09
|
||||
- accepted: -
|
||||
- rejected: -
|
||||
- superseded: -
|
||||
|
||||
**Decision [proposed]:** Spring Boot 4.0 — only actively-supported version; springmockk workaround via @TestConfiguration until a compatible release is published.
|
||||
|
||||
## Context and Problem Statement
|
||||
|
||||
GitTally is a greenfield Kotlin/Spring Boot project.
|
||||
A Spring Boot version must be chosen for the initial setup.
|
||||
|
||||
The choice is constrained by the support lifecycle: as of June 2026,
|
||||
almost the entire Spring Boot 3.x release train is already end-of-life.
|
||||
|
||||
### Technical Background
|
||||
|
||||
[Spring Boot support lifecycle](https://endoflife.date/spring-boot)
|
||||
([HeroDevs April 2026 overview](https://www.herodevs.com/blog-posts/spring-boot-versions-eol-dates-and-latest-releases-april-2026))
|
||||
as of June 2026:
|
||||
|
||||
| Version | EOL date | Status |
|
||||
|---------|----------------|---------------------------------|
|
||||
| 3.5.x | June 30, 2026 | Expires this month |
|
||||
| 4.0.x | December 2026 | **Active** (current: 4.0.6) |
|
||||
|
||||
Spring Boot 3.5.x is the final 3.x release; there will be no 3.6.
|
||||
The Spring project ended the 3.x train at 3.5 and continues in the 4.x line
|
||||
([Spring Boot milestones](https://github.com/spring-projects/spring-boot/milestones)).
|
||||
Spring Boot 4.0 moves to Spring Framework 7 and Jakarta EE 11.
|
||||
|
||||
The key ecosystem dependencies and their Spring Boot 4.0 compatibility status:
|
||||
|
||||
| Dependency | Role | Spring Boot 4.0 status |
|
||||
|---|---|---|
|
||||
| [picocli-spring-boot-starter](https://picocli.info/) | CLI wiring | Untested; last documented target is Spring Boot 3.1. The integration is minimal (one `IFactory` bean), so it likely works in practice. |
|
||||
| [springmockk](https://github.com/Ninja-Squad/springmockk) | `@MockkBean` in tests | **Incompatible** — confirmed Spring Boot 3.x only. |
|
||||
| [kotest-extensions-spring](https://github.com/kotest/kotest-extensions-spring) | Kotest + `@SpringBootTest` | Compatibility unconfirmed. |
|
||||
| [wiremock-spring-boot](https://wiremock.org/docs/spring-boot/) | HTTP stubbing in tests | **Compatible** — Spring Boot 4.0 explicitly supported since January 2026. |
|
||||
|
||||
## Considered Options
|
||||
|
||||
* Spring Boot 3.5.x (latest 3.x)
|
||||
* Spring Boot 4.0.x
|
||||
|
||||
### Spring Boot 3.5.x
|
||||
|
||||
The last actively-supported 3.x release.
|
||||
|
||||
#### Advantages
|
||||
|
||||
- Full compatibility with all current dependencies
|
||||
(picocli-spring-boot-starter, springmockk, kotest-extensions-spring).
|
||||
- Well-known ecosystem; documentation and community resources are mature.
|
||||
|
||||
#### Disadvantages
|
||||
|
||||
- EOL June 30, 2026 — expires this month.
|
||||
Starting a project on a version ending within days is indefensible.
|
||||
- Upgrading to Spring Boot 4.0 immediately after project start incurs migration cost
|
||||
at the worst possible time (early, before the codebase is stable).
|
||||
|
||||
### [Spring Boot 4.0](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Release-Notes)
|
||||
|
||||
The current and only actively-supported major release.
|
||||
|
||||
#### Advantages
|
||||
|
||||
- The only version receiving security patches and updates beyond June 2026.
|
||||
- Spring Framework 7 and Jakarta EE 11: active, long-term foundation.
|
||||
- Aligns with Gradle 9 when that upgrade is eventually made (ADR 0002).
|
||||
- Wiremock Spring Boot integration fully supports it.
|
||||
|
||||
#### Disadvantages
|
||||
|
||||
- **springmockk is incompatible.** The `@MockkBean` / `@SpykBean` annotations are not available.
|
||||
This matters in particular for `@WebMvcTest` (controller error-behaviour) and
|
||||
`@DataJpaTest`-adjacent tests where collaborators need to be mocked in the Spring context.
|
||||
The workaround is to register MockK mocks as Spring beans via `@TestConfiguration`,
|
||||
which preserves full MockK syntax (`every { }`, `verify { }`) at the cost of one
|
||||
inner configuration class per test file and an explicit `clearMocks()` call in `beforeEach`:
|
||||
```kotlin
|
||||
@WebMvcTest(SomeController::class)
|
||||
@Import(SomeControllerTest.Mocks::class)
|
||||
class SomeControllerTest : FunSpec() {
|
||||
@TestConfiguration
|
||||
class Mocks {
|
||||
@Bean fun someService(): SomeService = mockk()
|
||||
}
|
||||
@Autowired lateinit var someService: SomeService
|
||||
init {
|
||||
beforeEach { clearMocks(someService) }
|
||||
// full MockK syntax available
|
||||
}
|
||||
}
|
||||
```
|
||||
This is more verbose than `@MockkBean` but avoids mixing Mockito and MockK.
|
||||
Revisit once springmockk publishes a Spring Boot 4.0-compatible release.
|
||||
- **picocli-spring-boot-starter is untested against Spring Boot 4.0.**
|
||||
The risk is low (the auto-configuration is a single `IFactory` bean with no framework-version-specific API),
|
||||
but it cannot be assumed safe until verified by a running context test.
|
||||
- **kotest-extensions-spring** compatibility needs verification before the first
|
||||
`@SpringBootTest` test is written.
|
||||
- Relatively new GA; fewer community examples for the 4.0 generation.
|
||||
|
||||
## Decision Outcome
|
||||
|
||||
**Spring Boot 4.0** is chosen.
|
||||
|
||||
The main reasons:
|
||||
|
||||
- Spring Boot 3.5.x expires this month; starting on it is not a viable option.
|
||||
- Spring Boot 4.0 is the only release with active support through the foreseeable project lifetime.
|
||||
- The ecosystem blockers are manageable:
|
||||
- picocli-spring-boot-starter risk is low and will be confirmed by the existing
|
||||
context-wiring smoke test (`ApplicationContextTest`).
|
||||
- springmockk is a test-only dependency; the short-term workaround
|
||||
(`@TestConfiguration` with `mockk()` beans, `clearMocks()` in `beforeEach`)
|
||||
preserves full MockK syntax in `@WebMvcTest` and `@DataJpaTest` tests
|
||||
without falling back to Mockito.
|
||||
- kotest-extensions-spring compatibility must be verified before the
|
||||
first `@SpringBootTest` test is written.
|
||||
|
||||
Open items before the code is upgraded:
|
||||
1. Bump Spring Boot to 4.0.6 and verify `ApplicationContextTest` still passes.
|
||||
2. Confirm picocli-spring-boot-starter works under the new context.
|
||||
3. Confirm kotest-extensions-spring works with Spring Boot 4.0.
|
||||
4. Replace `@MockkBean` usages with the `@TestConfiguration` + `mockk()` pattern
|
||||
until springmockk publishes a compatible release.
|
||||
Reference in New Issue
Block a user