创建第 3 方 Java 库的存根
Create a stub of 3rd party Java library
我的任务是为我们的应用程序将调用的第 3 方 Java 库创建存根。我的问题是如何定义方法 "return type" 的 class(如果这是正确的 Java 术语)。我无权访问第 3 方 API 的完整文档,只是一个方法列表。现在,我的存根只需要 return 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;
}
}
也许你可以使用 classes 扩展存根 classes:
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
一种可能性(至少在学术上)是对实际的第 3 方库使用外观。您可能会创建一个 class,其中包含您需要的方法,并且您的主代码调用此 class 代替第三方库,包括您需要的所有方法和 return 1/0 等,当库可用时,从外观将调用分派给库。
但是,有一点要小心,如果库的实际数据模型很复杂,您最终可能会在代码中复制所有这些模型或它们的等价物,如果不是(例如简单的字符串等)。 ) 那么这种方法就可以了。
参考下面的评论作为示例,我添加以下内容:
假设我们有一个 class:
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
现在假设我们只有上面 class 的签名而不是 class 本身,那么我们可以执行以下操作(暂时):
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' class 并继续。
当实际的 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
其余四个代码不用改
您的文档很奇怪,因为变量和方法名称不符合 Java 使用驼峰命名法的约定。此外,您似乎被命令做的事情将在以后使用最少。但是,根据我对您问题的理解,您可以这样做:
- 为您将存根的所有 classes 创建新包。稍后会有相关内容
- 实际上存根的东西。也就是说,对于文档中未内置于 java 中的每个 class,创建 class。我假设你写的是一个方法声明(对我来说最有意义,虽然它也可以是一个构造函数或其他什么),它需要是一些 class 的一部分,我称之为 "Unknown"以下。将该名称替换为实际的 class 名称。
对于您的示例,您需要:
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 允许您访问的内容(仅 classes 和public 中的方法将是一个很好的经验法则)。您也可以使用接口而不是 classes,它会更干净,但有正当理由不这样做(例如,当您想要编译带有 new StubbedClass()
的代码时)。
现在,在您的实际代码中,您(或其他人)将能够像使用实际库一样使用您的存根:
public class YourBusinessClass{
public OobResponse getOobByClientName(String clientName){
return new Unknown().RequestOobRequest(clientName,...);
}
}
- 当您获得实际的库时,您可以将使用它的实际代码中的存根包导入替换为实际的库包。
这是我能想到的唯一有用的使用存根的方法,所以我希望这是你想要的。
我的任务是为我们的应用程序将调用的第 3 方 Java 库创建存根。我的问题是如何定义方法 "return type" 的 class(如果这是正确的 Java 术语)。我无权访问第 3 方 API 的完整文档,只是一个方法列表。现在,我的存根只需要 return 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;
}
}
也许你可以使用 classes 扩展存根 classes:
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
一种可能性(至少在学术上)是对实际的第 3 方库使用外观。您可能会创建一个 class,其中包含您需要的方法,并且您的主代码调用此 class 代替第三方库,包括您需要的所有方法和 return 1/0 等,当库可用时,从外观将调用分派给库。
但是,有一点要小心,如果库的实际数据模型很复杂,您最终可能会在代码中复制所有这些模型或它们的等价物,如果不是(例如简单的字符串等)。 ) 那么这种方法就可以了。
参考下面的评论作为示例,我添加以下内容:
假设我们有一个 class:
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
现在假设我们只有上面 class 的签名而不是 class 本身,那么我们可以执行以下操作(暂时):
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' class 并继续。
当实际的 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
其余四个代码不用改
您的文档很奇怪,因为变量和方法名称不符合 Java 使用驼峰命名法的约定。此外,您似乎被命令做的事情将在以后使用最少。但是,根据我对您问题的理解,您可以这样做:
- 为您将存根的所有 classes 创建新包。稍后会有相关内容
- 实际上存根的东西。也就是说,对于文档中未内置于 java 中的每个 class,创建 class。我假设你写的是一个方法声明(对我来说最有意义,虽然它也可以是一个构造函数或其他什么),它需要是一些 class 的一部分,我称之为 "Unknown"以下。将该名称替换为实际的 class 名称。
对于您的示例,您需要:
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 允许您访问的内容(仅 classes 和public 中的方法将是一个很好的经验法则)。您也可以使用接口而不是 classes,它会更干净,但有正当理由不这样做(例如,当您想要编译带有 new StubbedClass()
的代码时)。
现在,在您的实际代码中,您(或其他人)将能够像使用实际库一样使用您的存根:
public class YourBusinessClass{
public OobResponse getOobByClientName(String clientName){
return new Unknown().RequestOobRequest(clientName,...);
}
}
- 当您获得实际的库时,您可以将使用它的实际代码中的存根包导入替换为实际的库包。
这是我能想到的唯一有用的使用存根的方法,所以我希望这是你想要的。