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
相关产品推荐
相关产品推荐

