本文面向的是那些想要對他們的 EJB 進行單元測試以及為這些 EJB 開發測試案例的 VisualAge? for Java? 用戶.本文基於 VisualAge for Java 3.5.3 和 JUnit 3.7.文章描述了 JUnit、對 EJB 進行單元測試的難點以及開發測試案例時涉及到的相關步驟.
引言
本文面向的是那些想要對他們的 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 class SampleEjbBean implements SessionBean { private javax.ejb.SessionContext mySessionCtx = null; final static long serialVersionUID = 3206093459760846163L; /** * Insert the method's description here. * Creation date: (8/10/02 1:16:33 PM) * @return int * @param a int */ //The Business method public int addition(int a,int b) { return 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 setSessionContext(javax.ejb.SessionContext ctx) throws java.rmi.RemoteException { ..... } } |
通過繼承 JUnit.framework.TestCase 類創建一個測試類.命名約定:如果 bean 的名稱是 SampleEjbBean ,則將測試類命名為 SampleEjbBeanTest .例如:
public class SampleEjbBeanTest extends JUnit.framework.TestCase{ .
創建 Bean 的一個 remoteInterface 類型的類變數.例如:
SampleEjb remoteInterface
創建測試類的一個靜態實例:
static { instance = new SampleEjbBeanTest(""); } |
public static void main(String args[]) { if (args.length > 0){ if (args[0].equals("SWING")) { JUnit .swingui.TestRunner.run(instance.getClass()); } else { JUnit .textui.TestRunner.run(instance.getClass()); } } else { //formatting the Output System.out.println("************************************"); String className = instance.getClass().getName(); className = className.substring(className.lastIndexOf(".") 1); System.out.println("Test Report of:" className); System.out.println("************************************"); JUnit.textui.TestRunner.run(instance.getClass()); } } |
將初始上下文添加到 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 =new 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 = new 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 =new javax.naming.InitialContext(env); getinfo("Looking for the EJB " "SampleEjb"); SampleEjbHome homeInterface = (SampleEjbHome) ic.lookup("SampleEjb"); getinfo("Creating a new EJB instance"); remoteInterface = homeInterface.create(); } catch (NamingException e) { getinfo(e.toString()); fail(); } catch (Exception e) { getinfo("Create Exception"); getinfo(e.toString()); fail(); } } |
[火星人 ] 使用JUnit對EJB進行單元測試已經有181次圍觀