-
Notifications
You must be signed in to change notification settings - Fork 435
Description
Describe the bug
When using headers on the requests and running generated contract tests in MOCKMVC mode, tests fail with a NoSuchMethodError originating from RestAssured's MockMvc module. The exception is:
java.lang.NoSuchMethodError: 'org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.header(java.lang.String, java.lang.Object[])'
at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.applyHeaders(MockMvcRequestSenderImpl.java:514)
at io.restassured.module.mockmvc.internal.MockMvcRequestSenderImpl.sendRequest(MockMvcRequestSenderImpl.java:348)
...
at com.example.demo.GreetingTest.validate_shouldReturnGreeting(GreetingTest.java:28)
This appears to be caused by RestAssured's MockMvc integration calling MockHttpServletRequestBuilder.header(String, Object[]), a method signature that is not present in Spring Framework 7's MockHttpServletRequestBuilder (used by Spring Boot 4). In short: RestAssured's MockMvc module is not compatible with Spring Framework 7, which prevents contract tests in MOCKMVC test mode from running.
Versions (important)
- Spring Cloud:
2025.1.0 - Spring Cloud Verifier:
5.0.0 - Spring Boot:
4.0.0 - Java 25
- RestAssured
5.5.6(transitive dependency via Spring Cloud Contract)
Sample
Repro repo (minimal demo):
https://github.com/alexaugustobr/spring-cloud-contract-demo-bug-rest-assured-mockmvc
Relevant snippets:
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '4.0.0'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.springframework.cloud.contract' version '5.0.0'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
description = 'Demo project for Spring Boot'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2025.1.0")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
contracts {
}
tasks.named('contractTest') {
useJUnitPlatform()
}
tasks.named('test') {
useJUnitPlatform()
}
contracts {
testMode = 'MOCKMVC'
baseClassForTests = 'com.example.demo.RestAssuredMockMVCBaseContractTest'
}contracts/greeting/contract.groovy
package contracts.greeting
import org.springframework.cloud.contract.spec.Contract
Contract.make {
description 'Should return greeting with given name'
request {
method GET()
headers {
accept(applicationJson())
}
url('/greeting') {
queryParameters {
parameter 'message': 'Alex'
}
}
}
response {
status OK()
headers {
contentType(applicationJson())
}
body([ message: 'Hello, Alex!' ])
}
}RestAssuredMockMVCBaseContractTest.java
@WebMvcTest(controllers = GreetingController.class)
public abstract class RestAssuredMockMVCBaseContractTest {
@Autowired
private WebApplicationContext context;
@BeforeEach
void setUp() {
RestAssuredMockMvc.mockMvc(
MockMvcBuilders.webAppContextSetup(context)
.defaultResponseCharacterEncoding(StandardCharsets.UTF_8)
.build()
);
RestAssuredMockMvc.enableLoggingOfRequestAndResponseIfValidationFails();
}
}What I tried
Attempted to use CUSTOM test mode and write a custom test base, following the documentation, but I couldn't get it working. I had faced another bug related to @LocalServerPort not being injected correctly in Spring Boot 4 after adding Spring Cloud Verifier. I can share details if helpful.