Key testing changes when migrating from Spring Boot 3.x to 4.0.
Spring Boot 4.0 introduces modular test starters:
Before (3.x):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>After (4.0) - WebMvc Testing:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>After (4.0) - REST Client Testing:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-restclient-test</artifactId>
<scope>test</scope>
</dependency>Deprecated (3.x):
@MockBean
private OrderService orderService;New (4.0):
@MockitoBean
private OrderService orderService;Deprecated (3.x):
@SpyBean
private PaymentGatewayClient paymentClient;New (4.0):
@MockitoSpyBean
private PaymentGatewayClient paymentClient;Replaces TestRestTemplate (deprecated):
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestTestClient
class OrderIntegrationTest {
@Autowired
private RestTestClient restClient;
@Test
void shouldCreateOrder() {
restClient
.post()
.uri("/orders")
.body(new OrderRequest("Product", 2))
.exchange()
.expectStatus()
.isCreated()
.expectHeader()
.location("/orders/1");
}
}Spring Boot 4.0 uses JUnit 6 by default:
- JUnit 4 is deprecated (use JUnit Vintage temporarily)
- All JUnit 5 features still work
- Remove JUnit 4 dependencies for clean migration
Module naming changed:
Before (1.x):
<artifactId>postgresql</artifactId>After (2.0):
<artifactId>testcontainers-postgresql</artifactId>Spring Framework 7 allows mocking prototype-scoped beans:
@Component
@Scope("prototype")
public class OrderProcessor { }
@SpringBootTest
class OrderServiceTest {
@MockitoBean
private OrderProcessor orderProcessor; // Now works!
}Extension context is now test-method scoped by default.
If tests fail with @Nested classes:
@SpringExtensionConfig(useTestClassScopedExtensionContext = true)
@SpringBootTest
class OrderTest {
// Use old behavior
}- Replace @MockBean with @MockitoBean
- Replace @SpyBean with @MockitoSpyBean
- Update Testcontainers dependencies to 2.0 naming
- Add modular test starters as needed
- Migrate TestRestTemplate to RestTestClient
- Remove JUnit 4 dependencies
- Update custom TestExecutionListener implementations
- Test @Nested class behavior
Use "classic" starters for gradual migration:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test-classic</artifactId>
<scope>test</scope>
</dependency>This provides old behavior while you migrate incrementally.