专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » junit单元测试:使用 JUnit 在 VisualAge for Java 中对 EJB 进行单元测试 »正文

junit单元测试:使用 JUnit 在 VisualAge for Java 中对 EJB 进行单元测试

来源: 发布时间:星期四, 2009年1月8日 浏览:11次 评论:0
  引言

  本文面向是那些想要对他们 EJB 进行单元测试以及为这些 EJB 开发测试案例 VisualAge® for Java™ 用户本文基于 VisualAge for Java 3.5.3 和 JUnit 3.7文章描述了 JUnit、对 EJB 进行单元测试难点以及开发测试案例时涉及到相关步骤

  单元测试是以视角来编写单元测试确保个类某个特定思路方法能成功地执行组特定任务每个测试确定个思路方法在给定已知输入时能产生预期输出有效测试是有效编程个基本组成部分通过使用 JUnit 测试框架您能容易地并且逐步地构建个测试套件这个测试套件能帮助您调节工作进度、发现不希望出现副作用并把精力集中在开发工作上

  编写 EJBs 测试案例

  这里是个有关 EJB 举例该 EJB 带有个名为 addition 业务思路方法该思路方法以两个整型变量作为输入将它们相加后返回结果:

/**
* This is a Session Bean Class
*/
public SampleEjbBean implements SessionBean {
  private javax.ejb.SessionContext mySessionCtx = null;
  final long serialVersionUID = 3206093459760846163L;
 
/**
* Insert the method's description here.
* Creation date: (8/10/02 1:16:33 PM)
* @
* @param a
*/
//The Business method  
public addition( a, b) {
  a+b;
}
public void ejbActivate throws java.rmi.RemoteException {...}
public void ejbCreate throws javax.ejb.CreateException, java.rmi.RemoteException {...}public void ejbPassivate throws java.rmi.RemoteException {...}
public void ejbRemove throws java.rmi.RemoteException {...}
public javax.ejb.SessionContext getSessionContext {
  .....
}
public void SessionContext(javax.ejb.SessionContext ctx) throws java.rmi.RemoteException {
  .....  
}
}


  使用下列步骤创建个 EJB 测试案例

  通过继承 JUnit.framework.TestCase 类创建个测试类命名约定:如果 bean 名称是 SampleEjbBean 则将测试类命名为 SampleEjbBeanTest 例如:

  public SampleEjbBeanTest extends JUnit.framework.TestCase{

  创建 Bean 个 remoteInterface 类型类变量例如:

  SampleEjb remoteInterface

  创建测试类个静态例子: { 
  instance = SampleEjbBeanTest("");
}


  该例子被用来作为 TestRunner run 思路方法个参数以执行 TestClass. 思路方法和测试案例所以您可以在 SwingUI 或者 TextUI 中执行测试案例:

public void (String args)
{
  (args.length > 0){ 
    (args[0].equals("SWING")) { 
     JUnit .swingui.TestRunner.run(instance.getClass); 
   } 
    {
     JUnit .textui.TestRunner.run(instance.getClass);
   } 
 } 
  {
   //formatting the Output 
   .out.prln("************************************"); 
   String Name = instance.getClass.getName;
   Name = Name.sub(Name.lastIndexOf(".")+1);
   .out.prln("Test Report of:"+Name);
   .out.prln("************************************");
   JUnit.textui.TestRunner.run(instance.getClass);
  }
}


  接着创建个用于连接运行在服务器上 EJB bean 思路方法并为远程接口创建句柄:   将上下文添加到 HashMap 中例如:

  env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.ejs.ns.jndi.CNInitialContextFactory

  将 URL 添加到 HashMap 中例如:

  env.put(Context.PROVIDER_URL, "iiop://localhost:900");

  创建 InitialContext 对象例如:

  javax.naming.InitialContext ic = javax.naming.InitialContext(env);

  通过在命名服务器中查找 EJB Alias 名称来构造 Bean 个 homeInterface 例如:

  SampleEjbHome homeInterface = (SampleEjbHome) ic.lookup("SampleEjb");

  通过 homeInterface create 思路方法创建个 remoteInterface 例如:

  remoteInterface = homeInterface.create;Public void getConnection
  { 
   getinfo("Running " + this.toString);
 
   java.util.Hashtable env = Hashtable;
 
  //Adding the Initial Context to the HashMap.
  env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.ejs.ns.jndi.CNInitialContextFactory
"); 
   env.put(Context.PROVIDER_URL, "iiop://localhost:900");
   try 
   { 
     getinfo("Creating an initial context"); 
     javax.naming.InitialContext ic = javax.naming.InitialContext(env); 
     getinfo("Looking for the EJB " + "SampleEjb"); 
     SampleEjbHome homeInterface = 
     (SampleEjbHome) ic.lookup("SampleEjb"); 
     getinfo("Creating a EJB instance"); 
     remoteInterface = homeInterface.create; 
   } 
   catch (NamingException e) 
   {
     getinfo(e.toString); 
     fail; 
   } 
   catch (Exception e) 
   { 
     getinfo("Create Exception"); 
     getinfo(e.toString); 
     fail; 
   }
}


  在用于建立固定设备(fixture)(例如打开个网络连接打开个文件) up 思路方法中这个思路方法在测试执行前被 getConnection 思路方法使得测试案例连同 EJB 设置起得以public void Up throws Exception
{
  ......
  /*Invoking the getConnection method*/
  getConnection;
}


  为思路方法创建测试案例使用下列命名约定:将测试案例命名为 testXXXX(testAddition) 在 testMethod(testAddition) 中从 remoteInterface 对象业务思路方法( addition )例如: result=remoteInterface.addition(10,15);
public void testAddition {
  try{ 
    result=remoteInterface.addition(10,15); 
   getinfo("----------------------------------"); 
   getinfo("Success without Exception"); 
   assertEquals(25,result);
   } 
   catch(Exception e){
     fail("Fail"+e); 
     .out.prln("Error"+e);
   }
}


  为报告而开发其他思路方法:

public void getinfo(boolean msgObj)
{
  .out.prln(msgObj);
}
public void getinfo(String msg)
{
  .out.prln(msg);
}


  执行测试案例

  部署 EJB

  在 VisualAge for Java 上启动 WebSphere 测试环境(WebSphere Test Environment)和持久名称服务器(Persistence Name Server)

  将 EJB 添加到服务器配置中

  启动 EJB 服务器

  在 VisualAge for Java 中 思路方法执行测试类以下为运行结果:

************************************
Test Report of: SampleEjbBeanTest
************************************
. Running testAddition(com.prudential.retserv.chart.servlet.SampleEjbBeanTest)
Creating an initial context
Looking for the EJB SampleEjb
Creating a EJB instance
----------------------------------
Success without exception
Time: 15.984
OK (1 tests)


  通过此思路方法您能开发测试案例并从 EJB 被部署地方对该 EJB 进行单元测试

  对 EJB 进行单元测试时问题

  单元测试在单独地、隔离地并快速地运行时运行状况最佳个测试案例通常会构造它正在测试对象然而有时这个正在被测试对象要依赖于其他对象行为在这些情况下测试案例会建立个测试工具以“模拟”所需行为这个测试工具和真实系统有同样接口但实际上却不做任何事它“欺骗”被测试单元使它相信是系统在测试它EJBs 通常依赖于它们容器所提供上下文并且如果没有那些上下文大多数 EJBs 将不会起作用测试案例必须从执行该 EJB 容器中 EJB您也可以在 EJB 对象所在本地环境中测试它们但这样做可能使测试正确性大打折扣所以所开发测试案例应该在部署了 EJB 并且正在执行 EJB 容器中 EJB

  有关 JUnit 附加信息

  JUnit 测试能让您更快地开发出质量更高代码

  JUnit 测试检查它们自身运行结果并提供及时反馈



  JUnit 测试能被组织成呈层次结构多个测试套件

  您能快捷地并廉价地编写 JUnit 测试案例

  开发人员能很容易地完成 JUnit 测试

  JUnit 测试是用 Java 写成

  JUnit 能测试 EJBsservlets 和线程

  JUnit 是围绕两种主要设计模式而设计:命令模式和复合模式

  JUnit 是免费

  JUnit 不具备功能

  JUnit 不会从测试代码中分离出测试数据

  JUnit 不能对 Swing GUIs JSPs 或者 HTML 进行单元测试

  JUnit 测试不能取代功能测试即使您所有单元测试都成功也并 不意味着你软件Software切就绪

  JUnit 不能单元测试服务器端 Java 代码几种 Xunit 测试框架被设计用来单元测试服务器端 Java 代码

  结束语

  单元测试非常重要它们不仅能减少开发时间更能提高代码质量在 EJB 代码被开发前首先将单元测试写成个套件这些单元测试将提供个强有力确认和回归工具JUnit 能使单元测试案例编写工作变得更轻松



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: