Spring Cloud Contract测试/actuator/health端点返回404,如何编写正确的验证契约?
Spring Cloud Contract测试/actuator/health端点返回404,如何编写正确的验证契约?
嘿,我一眼就看出问题出在哪儿了!你现在的测试代码里,用RestAssuredMockMvc.standaloneSetup(new RecommendationController())手动初始化了自己的控制器,但完全没把Spring Boot Actuator的端点包含进去——这就是为什么手动curl能访问,但契约测试返回404的原因!
standaloneSetup是用来孤立测试单个控制器的,它不会加载Spring的自动配置,自然也不会注册Actuator的那些端点。咱们得调整测试类的配置,让它加载完整的应用上下文,这样Actuator的端点才会被包含进来。
解决方案一:加载完整Web上下文(Mock环境)
修改你的BaseTestClass,换成加载整个Web应用上下文,而不是只初始化自己的控制器:
package com.dreamseeker.videogamerecommendationservice; import io.restassured.module.mockmvc.RestAssuredMockMvc; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.web.context.WebApplicationContext; @SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.MOCK, properties = { "management.endpoints.web.exposure.include=*" }) public class BaseTestClass { @Autowired private WebApplicationContext webApplicationContext; @BeforeEach void setUp() { // 加载整个Web上下文,包含所有自动配置的端点(包括Actuator) RestAssuredMockMvc.webAppContextSetup(webApplicationContext); } }
解决方案二:使用真实Web环境(随机端口)
如果你更倾向于测试真实启动的应用(而非Mock MVC),可以改用RANDOM_PORT的Web环境,让Spring完整启动应用,包括所有Actuator端点:
package com.dreamseeker.videogamerecommendationservice; import io.restassured.RestAssured; import org.junit.jupiter.api.BeforeEach; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.server.LocalServerPort; @SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "management.endpoints.web.exposure.include=*" }) public class BaseTestClass { @LocalServerPort private int port; @BeforeEach void setUp() { RestAssured.baseURI = "http://localhost:" + port; } }
优化契约文件(可选)
你的契约文件本身是没问题的,不过可以补充上响应的Content-Type,让测试更严谨:
request: method: GET url: /actuator/health headers: Content-Type: application/json response: status: 200 headers: Content-Type: application/vnd.spring-boot.actuator.v3+json;charset=UTF-8
为什么原来的方式不行?
standaloneSetup只会注册你手动传入的控制器,完全跳过了Spring的自动配置流程——而Actuator的端点是通过ActuatorAutoConfiguration等自动配置类注册的,所以在你的原测试里根本不存在这些端点,自然返回404。
调整完测试类后,再运行契约测试,应该就能正常返回200了!
备注:内容来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

