首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CustomResouce模拟Fabric8

用CustomResouce模拟Fabric8
EN

Stack Overflow用户
提问于 2021-11-02 12:52:06
回答 1查看 77关注 0票数 0

我已经将Fabric8应用于访问OpenShift中的CustomResource,下面是一个工作的示例代码。

现在我正在写Junit测试,我被嘲笑困住了,有一些东西需要去模仿

  • 如何模拟KubernetesClient?
  • 如何模拟MixedOperation?这里是certClient。
  • 如何模拟CustomResouce?这里我们访问的是CertificateRequest,这是一个CRD。

有人能给出一些示例代码或指出如何实现吗?我很感激你的进阶。

代码语言:javascript
复制
    try (KubernetesClient k8sClient = new DefaultKubernetesClient()) {

      MixedOperation<
              CertificateRequest,
              KubernetesResourceList<CertificateRequest>,
              Resource<CertificateRequest>>
          certClient = k8sClient.resources(CertificateRequest.class);

      CertificateRequest certificateRequest =
          certClient.inNamespace(certNamespce).withName(certRequestName).get();
      if (certificateRequest == null) {
        logger.info(
            "CertificateRequest {} in certNamespce {} is a new one.",
            certRequestName,
            certNamespce);
      } else {
        certClient.inNamespace(certNamespce).withName(certRequestName).delete();
        logger.info(
            "Delete existing CertificateRequest {} in certNamespce {}, then create a new one.",
            certRequestName,
            certNamespce);
      }
    } catch (Exception exception) {
      logger.error("Hit an error when create a CertificateRequest: ", exception);
    }
EN

回答 1

Stack Overflow用户

发布于 2021-11-25 12:13:09

如果您的当前逻辑封装在如下方法中:

代码语言:javascript
复制
public void delete(String certNamespace, String certRequestName) {
  // Your logic
}

以及定义如下的CertificateRequest类:

代码语言:javascript
复制
  @Group("our-certificates.custom.example.com")
  @Version("v1")
  @Plural("certificaterequests")
  public static final class CertificateRequest
    extends CustomResource<CertificateRequestSpec, CertificateRequestStatus> {
  }

您可以使用KubernetesMock服务器执行两个单元测试:

第一个验证只执行GET请求以检查资源是否存在:

代码语言:javascript
复制
  @Test
  void testDeleteWhenNotExistsShouldDoNothing() throws Exception {
    new CertificateRequestExample(kubernetesClient).delete("my-namespace", "my-cert");
    assertThat(mockServer.getLastRequest())
      .hasFieldOrPropertyWithValue("path", "/apis/our-certificates.custom.example.com/v1/certificaterequests/my-cert")
      .hasFieldOrPropertyWithValue("method", "GET");
  }

第二个验证是否执行了删除请求。为此,在检查资源是否存在时,我们首先设置返回200的期望。

代码语言:javascript
复制
  @Test
  void testDeleteWhenExistsShouldDelete() throws Exception {
    mockServer.expect().get().withPath("/apis/our-certificates.custom.example.com/v1/certificaterequests/my-cert")
      .andReturn(200, "{}").once();
    new CertificateRequestExample(kubernetesClient).delete("my-namespace", "my-cert");
    assertThat(mockServer.getLastRequest())
      .hasFieldOrPropertyWithValue("path", "/apis/our-certificates.custom.example.com/v1/certificaterequests/my-cert")
      .hasFieldOrPropertyWithValue("method", "DELETE");
  }

这只是使用MockServer为该行为提供覆盖率的方法之一。

此外,我建议可能重构一点点您的逻辑,以便能够更好地测试。现在,您只依赖于日志来提供有关方法操作结果的反馈。在测试中,我们断言了最后一个请求,这很好,因为我知道该方法是如何实现的(白盒),所以我确定在这两种情况下最后一个请求是什么。

您可以在GitHub上检查此示例的完整源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69810796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档