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

Fabric8单元测试创建CRD报错及相关使用问题咨询

问题1:CRD接口v1()/v1beta1()版本选择依据

v1版本CRD在Kubernetes 1.16版本正式GA,v1beta1是1.16之前版本的遗留接口。Fabric8 5.9.0同时兼容两个版本,选择依据为你对接的目标集群版本:

  • 目标集群版本 >= 1.16:使用v1()接口,对应CRD yaml的apiVersion为apiextensions.k8s.io/v1
  • 目标集群版本 < 1.16:使用v1beta1()接口,对应CRD yaml的apiVersion为apiextensions.k8s.io/v1beta1
    你当前用的5.9.0版本客户端对两个版本都有完整支持,只要和你的CRD yaml版本、集群版本匹配即可。
问题2:server.expect()的作用与参数填充

server.expect()是Fabric8 Mock Kubernetes Server的请求桩配置接口,作用是提前定义Mock服务收到指定特征的请求时,返回的固定响应内容,实现不依赖真实集群的单元测试。
你注释的这行是为路径为/apis/stable.example.com/v1/namespaces/default/crontabs的GET请求打桩,如果你的测试逻辑是创建CRD后再创建CR、然后查询CR列表,?????位置需要填入你期望返回的CR列表对象:

  • 首先你需要自定义CronTab对应的POJO类,或者用GenericKubernetesResource通用类承载CR数据
  • 构造你要返回的1个或多个CronTab实例,封装进CustomResourceList对象作为andReturn的第二个入参
    如果当前测试只到CRD创建步骤,不需要调用CR查询接口,这行桩代码可以直接删除,不影响现有逻辑运行。
问题3:报错原因与修复方案

报错是因为KubernetesServer默认开启严格请求校验模式,所有没有提前打桩的请求都会直接返回失败。你调用create(cronTabCrd)方法时,Fabric8客户端底层会先发起GET请求查询已有的CRD列表做幂等校验,这个请求没有提前打桩所以触发异常。
有两种修复方案二选一即可:

  • 方案1:关闭Mock服务的严格校验,初始化KubernetesServer时指定非严格模式:
@Rule
public KubernetesServer server = new KubernetesServer(false, true);

非严格模式下未打桩的请求会返回默认空响应,不会抛出异常,适合简单的CRUD测试场景

  • 方案2:为所有用到的请求提前打桩,包括CRD创建流程涉及的GET查询、POST创建请求,适合需要精确控制返回值、校验请求参数的测试场景

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:06