unit-testing - Quarkus kubernetesMockServer 用于应用程序初始化
问题描述
我正在开发一个 Quarkus 应用程序,以作为 OpenShift/Kubernetes 集群中的操作员。使用 kubernetesMockServer 编写测试时,对开发应用程序的 REST 调用工作正常,但是当代码在初始化块内运行时失败,在日志中我看到模拟服务器正在回复 404 错误:
2020-02-17 11:04:12,148 INFO [okh.moc.MockWebServer] (MockWebServer /127.0.0.1:53048) MockWebServer[57577] received request: GET /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions HTTP/1.1 and responded: HTTP/1.1 404 Client Error
在 TestCode 我有:
@QuarkusTestResource(KubernetesMockServerTestResource.class)
@QuarkusTest
class TestAIRController {
@MockServer
KubernetesMockServer mockServer;
private CustomResourceDefinition crd;
private CustomResourceDefinitionList crdlist;
@BeforeEach
public void before() {
crd = new CustomResourceDefinitionBuilder()
.withApiVersion("apiextensions.k8s.io/v1beta1")
.withNewMetadata().withName("types.openshift.example-cloud.com")
.endMetadata()
.withNewSpec()
.withNewNames()
.withKind("Type")
.withPlural("types")
.endNames()
.withGroup("openshift.example-cloud.com")
.withVersion("v1")
.withScope("Namespaced")
.endSpec()
.build();
crdlist = new CustomResourceDefinitionListBuilder().withItems(crd).build();
mockServer.expect().get().withPath("/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions")
.andReturn(200, crdlist)
.always();
}
@Test
void test() {
RestAssured.when().get("/dummy").then().body("size()", Is.is(0));
}
}
虚拟休息使用相同的代码来搜索 CRD,事实上,当在没有观察启动事件的类的情况下运行时,它工作正常
@Path("/dummy")
public class Dummy {
private static final Logger LOGGER =LoggerFactory.getLogger(Dummy.class);
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response listCRDs(){
KubernetesClient oc = new DefaultKubernetesClient();
CustomResourceDefinition crd = oc.customResourceDefinitions()
.list().getItems().stream()
.filter( ob -> ob.getMetadata().getName().equals("types.openshift.example-cloud.com"))
.findFirst().get();
LOGGER.info("CRD NAME is {}", crd.getMetadata().getName());
return Response.ok(new ArrayList<String>()).build();
}
}
最后这是一个例外
@ApplicationScoped
public class AIRWatcher {
private static final Logger LOGGER = LoggerFactory.getLogger(AIRWatcher.class);
void OnStart(@Observes StartupEvent ev) {
KubernetesClient oc = new DefaultKubernetesClient();
CustomResourceDefinition crd = oc.customResourceDefinitions()
.list().getItems().stream()
.filter( ob -> ob.getMetadata().getName().equals("types.openshift.example-cloud.com"))
.findFirst().get();
LOGGER.info("Using {}", crd.getMetadata().getName());
}
}
就像由于某种原因,模拟服务器仍未为 Startup 事件初始化,有什么办法解决吗?
解决方案
问题是模拟服务器仅配置为在测试执行之前响应,而这段代码:
void OnStart(@Observes StartupEvent ev) {
KubernetesClient oc = new DefaultKubernetesClient();
CustomResourceDefinition crd = oc.customResourceDefinitions()
.list().getItems().stream()
.filter( ob -> ob.getMetadata().getName().equals("types.openshift.example-cloud.com"))
.findFirst().get();
LOGGER.info("Using {}", crd.getMetadata().getName());
}
在应用程序实际启动时运行(在任何@BeforeEach
运行之前)。
你能在 Quarkus Github 上打开一个问题吗?这应该是我们提供的解决方案
推荐阅读
- javascript - 下拉菜单 Bootstrap 不显示
- r - 使用portfolio.optimum的二次函数误差
- python - 哪个 Python 代码更好用?或者为此无关紧要
- javascript - Node.js 发送电子邮件模板 ejs 使用 flexbox
- html - CSS选择第三个相邻元素
- java - 无法在 Eclipse 中启动 Tomcat v9.0 服务器
- sql - 带有连接的 PostgreSQL Select 语句
- excel - VBA excel循环遍历一个范围以从列中拆分名称
- ios - 在为 iOS 编译时,如何让 Unity 自动添加 Sign In With Apple 功能?
- lua - Garry's Mod Lua:如何进行延迟/冷却?