使用 WebSphere 业务对象以测试驱动的方式开发业务逻辑

了解如何设置 Java™ SE 开发环境,促进以测试驱动的方式开发利用 WebSphere 业务对象的 SOA 业务逻辑。这种环境允许您在 WebSphere® Process Server 之外的地方运行 JUnit 测试用例。

Albert Chung, 顾问软件工程师, IBM

Albert Chung 的照片Albert Chung 是北卡罗来纳州达汉姆 IBM Research Triangle Park Lab 的一名软件工程师。他目前是 WebSphere Business Object Framework 团队的首席开发人员。



2011 年 11 月 01 日

简介

测试驱动的开发 (TDD) 是敏捷软件开发中的关键实践。TDD 是一种编码风格,它先以可执行示例(通常是 JUnit 测试用例)的形式编写所需的行为或规范。TDD 是一种迭代流程,需要您在代码开发中对代码做出细微增量式更改之后运行测试用例。因此,要使 TDD 切实有效,则必须迅速运行此类测试用例。

目前,如果您希望测试使用 WebSphere 业务对象的业务逻辑,就必须将您的代码部署到一台正在运行的服务器中,以便运行它。这使得 TDD 无法实现。如果能够在一个简单的 Java SE 环境中开发代码并运行 JUnit 测试用例,而不必将测试用例部署到服务器,那么一切必然会更加简单。这篇文章介绍了如何在任何基于 Eclipse 的集成开发环境(IDE)中设置一个简单的 Java SE 开发环境。这种环境将允许您处理业务对象(创建、操作、复制、对比、序列化等)。随后还展示了如何利用这种开发环境,使用 TDD 方法实现一种简单的面向服务架构(SOA)业务逻辑。

示例项目文件

在 “下载” 部分中,您可以找到 SampleProject.zip 文件。这个文件是包含本文中所用的完整源代码、JUnit 测试用例和模式的 Java 项目。


设置 Eclipse 开发环境

您可以使用任何基于 Eclipse 的 IDE。例如,您可以使用 WebSphere Integration Developer,也可直接从 Eclipse.org 站点下载基本的 Eclipse-IDE。

按照以下步骤设置开发环境:

  1. 启动 Eclipse IDE 并创建一个新工作区。
  2. 切换到 Java 透视图。
  3. 选择 File > New > Java Project
  4. 输入 BOJUnit 作为 Java 项目名称。
  5. 单击 Configure JREs... 链接打开 Installed JREs 的首选项对话框,如图 1 所示。
    图 1. Installed JREs 对话框
    Installed JREs 对话框
  6. 单击 Add 按钮打开 Add JRE 对话框(如图 2 所示)。
  7. 选择 Standard VM 作为 JRE 类型,随后单击 Next
    图 2. Add JRE 对话框
    Add JRE 对话框
  8. 单击 Directory... 按钮,浏览找到您的 WebSphere Process Server JRE 目录。举例来说,如果 C:\W75 是您的 WebSphere Process Server(以下简称为 Process Server)安装位置,选择 C:\W75\java 目录。
  9. 输入 WPS_JRE 作为 JRE 名称,单击 Finish
  10. 单击 OK 退出首选项对话框,返回 New Java Project 对话框。
  11. 选择 Use a project specific JRE 单选按钮,随后选择您刚刚定义的 WPS_JRE
  12. 在 Java Settings 页面中单击 Next
  13. 选择 Libraries 选项卡并单击 Add Library... 按钮打开 Add Library 对话框。
  14. 选择 JUnit > Next 打开 JUnit Library 对话框。
  15. 从下拉列表中选择 JUnit4 作为 JUnit 版本,并单击 Finish
  16. 返回 Java Settings 页面,单击 Add Library... 按钮打开 Add Library 对话框。这一次选择 User Library > Next 打开 User Library 对话框。
  17. 单击 User Libraries... > New... 并输入 WPS 作为用户库名称。
  18. 返回 User Library 页面,选择 WPS,随后单击 Add Jars... 按钮。
  19. 选择 C:\W75\lib\bootstrap.jar(使用您的 Process Server 安装位置替换 C:\W75)。
  20. 返回 User Library 页面,选择 WPS,随后再次单击 Add Jars... 按钮。
  21. 这一次选择 C:\W75\plugins 目录中的所有 JAR 文件(使用您的 Process Server 安装位置替换 C:\W75),如图 3 所示。
    图 3. WPS User Libraries
    WPS User Libraries
  22. 单击 OK > Finish
  23. 返回 Java Settings 页面,如图 4 所示,单击 Order and Export 选项卡,将 WPS JRE 移动到列表底部。
    图 4. Order and Export 选项卡(版本 6.x)
    Order and Export 选项卡(版本 6.x)
  24. 单击 Finish

对于 Process Server 版本 6.x,您的开发环境设置至此已经完成。

对于 Process Server 版本 7 或更高版本,还需要执行以下步骤:

  1. 在 Java Settings 页面中选择 Libraries 选项卡。
  2. 单击 User Libraries... > New...,输入 FeaturePack 作为用户库名称。
  3. 在 User Library 页面中选择 FeaturePack,随后单击 Add Jars... 按钮。
  4. 将这些 JAR 添加到 FeaturePack 用户库(使用您的 Process Server 安装位置替换 C:\W75),如图 5 所示:
    1. C:\W75\feature_packs\sca\sdoplugins\sdo_api.jar
    2. C:\W75\feature_packs\sca\sdoplugins\sdoe.jar
    3. C:\W75\feature_packs\sca\sdoplugins\sdox_api.jar
    4. C:\W75\feature_packs\xml\plugins\com.ibm.xml.jar
    图 5. FeaturePack 用户库
    FeaturePack 用户库
  5. 单击 OK > Finish 返回 Java Settings 页面。
  6. 单击 Order and Export 选项卡,将 FeaturePack 用户库移动到列表顶部,如图 6 所示。
    图 6. Order and Export 选项卡(版本 7.x)
    FeaturePack 用户库
  7. 单击 Finish

这就完成了开发环境的设置。利用这个环境,您就可以测试业务对象,就像它们在 Process Server 环境中运行一样。举例来说,您可以在这个 Java SE 开发环境中创建 BO、复制 BO、序列化 BO 等。下一节内容展示了创建客户 BO 的一个示例,随后在开发环境中设置此 BO 的名称。


使用 TDD 方法实现业务逻辑

这一节使用简单的场景展示了如何使用上一节创建的开发环境尝试 TDD。

场景需求

在 SOA 应用程序业务逻辑中开发一种行为,以便使用数据完整填充客户业务对象。为了简化场景,您将仅仅使用姓氏和名字填充客户 BO。

TDD 工作流

本文假设您已经熟悉了 TDD。本节的重点在于展示如何在开发使用业务对象的业务逻辑时使用 TDD。图 7 中的流程图展示了使用 TDD 作为 编码风格时应该遵循的步骤。

图 7. TDD 风格的软件开发工作流
TDD 风格的软件开发工作流

编写测试用例

TDD 的第一个步骤是使用可执行示例的形式描述所需行为。换句话说,使用 JUnit 测试用例来捕捉场景需求。

按照以下步骤来创建 JUnit 测试用例:

  1. 在您之前创建的 BOJunit Java 项目中,添加一个名为 CustomerTest.java 的新 Java 类。单击 File > New > Class
  2. 将清单 1 中所示的代码复制粘贴到 CustomerTest.java 中:
    清单 1. JUnit 测试类 CustomerTest.java
    importstatic org.junit.Assert.assertEquals;
    import org.junit.Test;
    import com.ibm.websphere.bo.BOFactory;
    import com.ibm.websphere.sca.ServiceManager;
    import commonj.sdo.DataObject;
    
    publicclass CustomerTest {
    
     @Test
     publicvoid populateCustomer() {
      BOFactory boFactory = (BOFactory) ServiceManager.INSTANCE.locateService
       ("com/ibm/websphere/bo/BOFactory");
      DataObject dobj = boFactory.create("http://www.ibm.com/Customer","Customer");
      MyBusinessLogic myLogic = new MyBusinessLogic();
      myLogic.populateCustomer(dobj, "John", "Doe");
      assertEquals("John", dobj.get("firstName"));
      assertEquals("Doe", dobj.get("lastName"));
    	}
    }
  3. 请注意,由于 MyBusinessLogic 类尚不存在,因此出现了一个编译错误。请单击 MyBusinessLogic 行,随后按 Ctrl + 1。在上下文菜单中选择 Create class “MyBusinessLogic” 使 Eclipse 自动为您生成这个类。
  4. 返回 Java 编辑器处理 CustomerTest.java。现在,编译错误发生在 myLogic.populateCustomer。请单击这一行,随后按 Ctrl + 1。在上下文菜单中选择类型为 MyBusinessLogic 的 Create 方法 myLogic.populateCustomer(DataObject, String, String),使 Eclipse 自动为您生成此方法。
  5. 此时 Java 项目中不应再有任何编译错误。现在,您可以继续进行 TDD 风格的软件开发工作流的 第 2 步,也就是运行测试用例直至发生故障。在 Java 编译器中右键单击 CustomerTest.java,打开上下文菜单。
  6. 单击 Run as > JUnit test
  7. 正如预期的一样,测试失败,并显示了以下错误消息:java.lang.NullPointerException。这是因为您尚未在模式中定义 Customer,这将导致 boFacory.create 方法返回 null。创建 Customer.xsd 文件,如清单 2 所示,随后将其复制粘贴到 src 目录中(您可以将模式和 WSDL 放在任何目录中,只要它处于类路径中即可)。
    清单 2. Customer.xsd 模式
    <?xml version="1.0" encoding="UTF-8"?>
    <schema targetNamespace="http://www.ibm.com/Customer" 
    	xmlns="http://www.w3.org/2001/XMLSchema">
    	<complexType name="Customer">
    	 <sequence>
    		<element name="firstName" type="string" />
    		<element name="lastName" type="string" />
    	 </sequence>
        </complexType>
    </schema>
  8. 重复第 5 步和第 6 步,重新运行 JUnit 测试。
  9. 这一次,测试失败时将显示以下错误消息:java.lang.AssertionError: expected:<John> but was:<null>。这是可想而知的,因为您还没有实现 MyBusinessLogic.populateCustomer 方法中的业务逻辑。请使用清单 3 所示的代码实现此方法。
    清单 3. MyBusinessLogic.java
    import commonj.sdo.DataObject;
    
    publicclass MyBusinessLogic {
     publicvoid populateCustomer(DataObject dobj, 
     String firstName, String lastName) {
    	dobj.set("firstName", firstName);
    	dobj.set("lastName", lastName);
      }
    }
  10. 重复第 5 步和第 5 步,重新运行 JUnit 测试。这一次,测试用例通过了。这是 TDD 风格的软件开发工作流的 第 4 步。由于您刚刚编写了一个测试用例,而本示例中的业务逻辑实现也比较简单,因此无需执行 TDD 风格的软件开发工作流的第 5、6、7 步。

正如您可以通过上述步骤看到的那样,TDD 是一种迭代流程,您可以依靠在增量式代码更改之后允许 JUnit 测试用例。测试结果不仅能告诉您测试用例是通过还是失败,还能告诉您问题在哪里。这允许您每次修复一个问题(运行测试 > 故障 > 修复代码 > 运行测试 > 故障 > 修复代码 > 修复代码 > 运行测试 > 成功)。


结束语

本文描述了如何设置一个 Java SE 开发环境来促进使用 WebSphere 业务对象的 SOA 业务逻辑的 TDD。这个环境允许您在 WebSphere Process Server 环境以外的地方运行 JUnit 测试用例。此外还使用了一个简单的场景来演示 TDD 风格的开发。最终的结果是实现了必要的业务逻辑和 JUnit 测试用例,可验证实现的行为。


下载

描述名字大小
示例代码SampleProject.zip4KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=768790
ArticleTitle=使用 WebSphere 业务对象以测试驱动的方式开发业务逻辑
publish-date=11012011