You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:33:07