首页 > 解决方案 > 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 事件初始化,有什么办法解决吗?

标签: unit-testingkubernetesjunitquarkusfabric8

解决方案


问题是模拟服务器仅配置为在测试执行之前响应,而这段代码:

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 上打开一个问题吗?这应该是我们提供的解决方案


推荐阅读