【问题标题】:Create a stub of 3rd party Java library创建 3rd 方 Java 库的存根
【发布时间】:2016-09-20 14:07:22
【问题描述】:

我的任务是为我们的应用程序将调用的第 3 方 Java 库创建存根。我的问题是如何定义方法“返回类型”的类(如果这是正确的 Java 术语)。我无权访问第 3 方 API 的完整文档,只有方法列表。现在,我的存根只需要返回 true/false 或 1/0,随便什么

以下是一种说明方法的示例。这是我得到的

OobResponse RequestOobRequest(
   String ClientName,
   String SecurityLink,
   short LenofHHU,
   RequestMode RequestMode)

我不知道 OobResponse 或 RequestMode 应该是什么,但我应该仍然能够创建存根,对吧?

到目前为止,这就是我所拥有的。

public class stubber {

  public class OobResponse {
    public int someVar;
  }
  public class RequestMode {
    public int someVar;
  }

  public OobResponse RequestOobRequest(
    String ClientName,
    String SecurityLink,
    short LenofHHU,
    RequestMode RequestMode)
  {
      OobResponse oobr = new OobResponse();
      return oobr;
  } 
}

【问题讨论】:

  • 以后你会用真正的类替换OobResponseRequestMode 吗?我没有看到创建一个“看起来像”第三方库但实际上并不等同的类的意义。
  • 是的,我们目前无法访问第 3 方 API,只能访问其文档,因此我们正努力提前完成工作。将它存根的想法意味着我们可以构建对它的调用,并且(希望)当我们真正掌握它时,我们可以将它插入而不是存根。无论如何,这就是希望!
  • 那么,您的基本计划是在不知道实际使用的数据类型的情况下模拟 API?我会节省自己创建无用代码的时间,因为一旦您将假类与真实类交换后,您将不得不使用此 API 编译所有项目,甚至可能需要根据它调整行为。
  • @Smutje 我听到了,但我被要求执行此任务,而且我是 Java 新手,所以您能提供的任何帮助都会很棒。
  • 是的,为什么不为您知道的所有类创建 Java 接口,然后再实现这些接口?

标签: java stub


【解决方案1】:

您拥有的文档很奇怪,因为变量和方法名称不符合 Java 使用 camelCase 的约定。此外,您似乎被命令做的事情将在以后很少使用。但是,按照我理解您的问题的方式,您可以这样做:

  • 为您要存根的所有类创建新包。这将在以后相关
  • 实际上是存根的东西。也就是说,为文档中未内置于 java 中的每个类创建该类。我假设你写的是一个方法声明(对我来说最有意义,虽然它也可以是一个构造函数或其他什么),它需要是某个类的一部分,我在下面将其称为“未知”。将该名称替换为实际的类名。

对于您的示例,您需要:

public class RequestMode {

}

public class OobResponse {

}

public class Unknown {

    public OobResponse RequestOobRequest(
            String ClientName,
            String SecurityLink,
            short LenofHHU,
            RequestMode RequestMode){
        return new OobResponse(); // or null, whatever since it is a stub
    }
}

请注意,在存根时,您不会创建任何其他变量(例如您尝试添加的someVar),仅允许您访问哪些 API(仅使用其中的类和公共方法是一个很好的经验法则)。您也可以使用接口而不是类,这样会更简洁,但有正当理由不这样做(例如,当您希望编译带有 new StubbedClass() 的代码时)。

现在,在您的实际代码中,您(或某人)将能够像实际库一样使用您的存根:

public class YourBusinessClass{

     public OobResponse getOobByClientName(String clientName){
         return new Unknown().RequestOobRequest(clientName,...);
     }

}
  • 获得实际库后,您可以将使用它的实际代码中的存根包中的导入替换为实际库包。

这是我能想到的唯一有用的使用存根的方法,所以我希望这是你想要的。

【讨论】:

  • 好吧,这个和我写的很像,挺好的。这意味着我离得太远了。唯一真正的区别是您将 RequestMode 和 OobResponse 类放在 Unknown 类之外,而我将它们放在里面。这有什么不同吗?
  • @JDor 简而言之 - 是的。您需要阅读 Java 如何处理类,尤其是内部类。根据经验,除非您知道自己在做什么,否则不应在类中使用类。
【解决方案2】:

一种可能性(至少在学术上)是对实际的 3rd 方库使用外观。您可能可以创建一个具有您需要的方法的类,并且您的主要代码调用该类来代替 3rd 方库,包括您需要的所有方法并返回 1/0 等,当该库可用时调度从外观调用库。

但是,需要注意的是,如果库的实际数据模型很复杂,您最终可能会在代码中复制所有这些模型或它们的等价物,如果不是(如简单字符串等),那么这种方法会奏效。

例如参考下面的评论,我添加以下内容:

假设我们有一个类:

public class Class0{

 public String method0(String arg0){return "from Method 0";}
 public String method1(String arg0, String arg1){return "from Method 1";}

}//class closing

现在假设我们只有上述类的签名而不是类本身,那么我们可以执行以下操作(暂时):

public Class0Facade{

 public String method0(String arg0){return "from Method 0";}
 public String method1(String arg0, String arg1){return "from Method 1";}

}//class closing

您的其余代码可以使用“class0Facade”类并继续。

当实际的 Class0 可用时,您可以通过以下方式更改 Class0Facade:

public Class0Facade{

 protected Class0 deligate;

 public Class0Facade(){delegate=new Class0();}
 public String method0(String arg0){return delegate.method0(arg0);}
 public String method1(String arg0, String arg1){return delegate.method(arg0, arg1);}

}//class closing

其余四行代码无需更改

【讨论】:

  • 感谢您的回复,但我是菜鸟,我不知道您在说什么。您能否向我展示一个如何实现我在问题中定义的 RequestOobRequest 方法的简单示例?
  • 刚刚看到你的更新。非常感谢您的有用回复 - 非常感谢。
【解决方案3】:

也许您可以使用扩展存根类的类:

public class Stubber extends StubbedClass {
  public OobResponse RequestOobRequest(
    String ClientName,
    String SecurityLink,
    short LenofHHU,
    RequestMode RequestMode) {
      OobResponse oobr = new OobResponse();
      return oobr;
    }
} 

如果你不能创建一个 OobResponse,你可以类似地创建一个 public class OobResponseStub extends OobResponse

【讨论】:

  • OP 应该如何扩展一个他甚至没有的类 - 发明两者并在之后有 两个 发明类?
  • 啊,我写回复的时候不知道第3方库类还不存在。当然,那时你不能使用这种方法。
  • 感谢您的回复!不过我不明白 - 什么是 StubbedClass?
  • StubbedClass 将是您稍后将使用的类,如果您扩展它,您可以更改行为并创建一个只返回没有逻辑的简单对象的存根,因为您还没有这个类,这是不可行的。如果您能够设法获得 java 接口,而不是“即将可用”库的仅文本文档,您可以使用它们来创建简单的 Stub 类。
  • 啊,明白了。谢谢。是的,这远非理想情况,但我对此无能为力。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2010-11-03
  • 2020-01-12
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2020-08-27
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多