Spring Cloud CDC配置问题:baseClassMappings触发MockMVC未配置异常
我之前配置Spring Cloud Contract的时候也踩过类似的坑,咱们来一步步拆解问题原因和解决办法:
问题根源
当你使用packageWithBaseClasses时,Contract Verifier会全局指定基类所在的包,所有生成的契约测试类都会自动继承该包下的ContractVerifierBase类,基类里的MockMVC初始化逻辑能正常执行。但切换到baseClassMappings后,若路径匹配规则不正确、基类关联失败,生成的测试类就会缺少MockMVC的初始化代码,从而抛出这个异常。
具体解决步骤
1. 修正路径匹配规则
baseClassMapping的第一个参数是Ant风格的路径匹配,而且是相对于你设置的contractsDslDir(即src/test/resources/contracts)的路径。你当前写的"src/test/resources/contracts/one.*"不符合规则,应该根据实际契约文件的位置调整:
- 如果是
one目录下的所有契约文件,改成:baseClassMapping("one/**", "my.app.ContractVerifierBase") - 如果是文件名以
one开头的契约,改成:baseClassMapping("**/one*.groovy", "my.app.ContractVerifierBase")
2. 确保基类正确初始化MockMVC
你的ContractVerifierBase类必须包含MockMVC的初始化逻辑,比如用JUnit 5的@BeforeEach注解在每次测试前初始化:
package my.app; import io.restassured.module.mockmvc.RestAssuredMockMvc; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; public class ContractVerifierBase { @Autowired private MockMvc mockMvc; @BeforeEach void setUpMockMvc() { // 初始化RestAssured的MockMVC实例 RestAssuredMockMvc.mockMvc(mockMvc); } }
如果是独立测试(不依赖Spring上下文),可以用standaloneSetup指定你的控制器:
@BeforeEach void setUpMockMvc() { RestAssuredMockMvc.standaloneSetup(new YourController()); }
3. 校验基类的全类名和位置
确认"my.app.ContractVerifierBase"的拼写完全正确,基类文件必须放在src/test/java/my/app目录下(和包结构对应),这样Contract Verifier才能找到它。
4. 清理缓存并重新构建
有时候构建缓存会导致生成的测试类没有更新,执行以下命令清理并重新生成测试:
- Gradle项目:
./gradlew clean build - Maven项目:
mvn clean install
验证配置
修改后的baseClassMappings配置应该类似这样:
contracts { contractsDslDir.set(file("src/test/resources/contracts")) testFramework.set(org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5) baseClassMappings { // 匹配one目录下所有契约,映射到指定基类 baseClassMapping("one/**", "my.app.ContractVerifierBase") } }
内容的提问来源于stack exchange,提问作者slavkovicdjordje

