对J2EE中的DAO组件编写单元测试

单元测试作为保证软件质量及重构的基础,早已获得广大开发人员的认可。单元测试是一种细粒度的测试,越来越多的开发人员在提交功能模块时也同时提交相应的单元测试。对于大多数开发人员来讲,编写单元测试已经成为开发过程中必须的流程和最佳实践。

对普通的逻辑组件编写单元测试是一件容易的事情,由于逻辑组件通常只需要内存资源,因此,设置好输入输出即可编写有效的单元测试。对于稍微复杂一点的组件,例如Servlet,我们可以自行编写模拟对象,以便模拟HttpRequest和HttpResponse等对象,或者,使用EasyMock之类的动态模拟库,可以对任意接口实现相应的模拟对象,从而对依赖接口的组件进行有效的单元测试。

在J2EE开发中,对DAO组件编写单元测试往往是一件非常复杂的任务。和其他组件不通,DAO组件通常依赖于底层数据库,以及JDBC接口或者某个ORM框架(如Hibernate),对DAO组件的测试往往还需引入事务,这更增加了编写单元测试的复杂性。虽然使用EasyMock也可以模拟出任意的JDBC接口对象,或者ORM框架的主要接口,但其复杂性往往非常高,需要编写大量的模拟代码,且代码复用度很低,甚至不如直接在真实的数据库环境下测试。不过,使用真实数据库环境也有一个明显的弊端,我们需要准备数据库环境,准备初始数据,并且每次运行单元测试后,其数据库现有的数据将直接影响到下一次测试,难以实现“即时运行,反复运行”单元测试的良好实践。

本文针对DAO组件给出一种较为合适的单元测试的编写策略。在JavaEE开发网的开发过程中,为了对DAO组件进行有效的单元测试,我们采用HSQLDB这一小巧的纯Java数据库作为测试时期的数据库环境,配合Ant,实现了自动生成数据库脚本,测试前自动初始化数据库,极大地简化了DAO组件的单元测试的编写。

在Java领域,JUnit作为第一个单元测试框架已经获得了最广泛的应用,无可争议地成为Java领域单元测试的标准框架。本文以最新的JUnit 4版本为例,演示如何创建对DAO组件的单元测试用例。

JavaEEdev的持久层使用Hibernate 3.2,底层数据库为MySQL。为了演示如何对DAO进行单元测试,我们将其简化为一个DAOTest工程:

由于将Hibernate的Transaction绑定在Thread上,因此,HibernateUtil类负责初始化SessionFactory以及获取当前的Session:

  public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration()
.configure()
.buildSessionFactory();
}
catch(Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
}
HibernateUtil还包含了一些辅助方法,如:  public static Object query(Class clazz, Serializable id);
public static void createEntity(Object entity);
public static Object queryForObject(String hql, Object[] params);
public static List queryForList(String hql, Object[] params);

在此不再多述。

时间: 2024-09-11 18:39:25

对J2EE中的DAO组件编写单元测试的相关文章

软件体系架构模式在J2EE中的应用

本文介绍了软件体系架构产生的背景和架构模式的基本理论.重点介绍管道与过滤器体系架构模式的结构,实现,优缺点等,然后以J2EE的Servlet Filter为例进行剖析它是怎样应用该架构模式的,最后简单阐述了在其它J2ee应用中(Jboss和Axis)的实践. 软件体系架构 1.软件体系架构产生背景 在经历60年代的软件危机之后,使人们开始重视软件工程的研究.来自不同应用领域的软件专家总结了大量的有价值的知识. 当初,人们把软件设计的重点放在数据结构和算法的选择上,如Knuth提出了数据结构+算法

不要为数据持久层编写单元测试

为增强自信心而写代码 关于单元测试,其作用我认为更多的是增强开发者的信心,以及作为代码的执行文档(额外的效果).也就是说,编写单元测试首先是开发者的责任,其次单元测试的粒度由程序员的自信心决定. "老板为我的代码付报酬,而不是测试,所以,我对此的价值观是--测试越少越好,少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的标准,当然,这种自信也可能是种自大).如果我的编码生涯中不会犯这种典型的错误(如:在构造函数中设了个错误的值),那我就不会测试它.我倾向于去对那些有意义的错

J2EE中常用的名词解释

J2EE中常用的名词解释 1.web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接和容器中的环境变量接接口互,不必关注其它系统问题.主要有WEB服务器来实现.例如:TOMCAT,WEBLOGIC,WEBSPHERE等.该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准.我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器. 2.Web container:实现J2EE体系结构中Web组件协议的容器.这个协议规定

在J2EE中APPLET和HTML作为客户端的比较

j2ee|比较|客户端 前言 在j2ee中,客户端常用的两中方式是html,和基于application的applet,因为采用的技术不同,这两个方式都有其优缺点,在考虑采用何种技术(或者两种都用),需要根据两种技术的特点,以及此项目的应用范围来综合考虑.以下分"易用性","性能","维护,扩展","交互","安全"五部分来说明各自的特点,并针对客户,开发人员角色阐明一下个人观点. 易用性 客户对于易用性要

JAVA 中 jar 文件的编写和应用

JAVA中jar文件的编写和应用     我想JAVA的爱好者,尤其是初学者大都有过这样的经历,就是喜欢JAVA编程语言(这个人的情况可能不一样),但是有时候总会觉得JAVA的优点便是她的"致命"的缺点.大家的信念依旧是"一次编译,到处运行"但是就是因为至一点JAVA失去了好多,我们也失去了好多.也许大家都知道,现在业界最推崇的还是微软的技术微软的产品..net/c#/.vb/vb.net还是最流行的语言,最受欢迎的软件开发语言.因为这些语言都太好学太好用了.不像J

在ASP中调用DCOM组件的应用技巧

在ASP中调用DCOM组件的应用技巧 1.编写DCOM组件: 假设我们想通过ASP页面来远程启动DNS服务,并且DNS服务器与Web服务器不为同一台机器.我们可以编写一个ActiveX DLL 来实现这个功能. 首先我们建立一个批处理文件StartDNS.bat,文件中写入:Net Start DNS.将文件保存在DNS服务器的一个目录下,例如C:\ManDNS\: 其次我们编写 Dll 程序如下(VB编写): Public Function StartDNS() As Boolean On E

实现应用程序中的并行组件共享(一)

摘要:探讨 Microsoft(R) Windows(R) 2000 和 Windows 98 第二版本中并行共享组件的实现(如 Windows 认证规范中讨论的).包括新的并行组件的创建以及使用 DLL/COM 重定向处理相同组件的不同版本之间的不兼容性.包括编写和安装并行组件以及重新打包和测试应用程序的指南. 目录 介绍 一点背景知识 新组件共享策略 比较两种策略 创建新的并行组件 并行组件编写指南 安装并行组件 DLL/COM 重定向 使用 DLL/COM 重定向 介绍 现代操作系统和应用

认识DHTML中的“行为”组件(读后大有启发)

认识DHTML中的"行为"组件 在微软IE 5.0版本的浏览器发布以前,网页编程中面对的最大挑战就是不能轻易地创建组件,以达到代码重用和多页面共享的目的.这个问题一直困扰着DHTML(动态 HEML)的网页编程者.他们只能不断地重复书写HTML.CSS和JAVASCRIPT的代码,以满足多个页面上的重复或相似的功能.自IE 5.0浏览器发布后,这种情况得到了改善,它带给我们一个新的指令组合方法,可把实现特定功能的代码封装在一个组件内,从而实现多页面的代码重用,使网页编程进入一个全新的天

JUnit一个回归测试框架用于Java开发人员编写单元测试

通过本文的介绍,您可以了解到什么是 Jhttp://www.aliyun.com/zixun/aggregation/29926.html">Unit,它有什么用处,JUnit 4.10 有什么新特性,并且如何应用. JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),主要供 Java 开发人员编写单元测试.在极限编程和重构中被极力推荐使用的一个工具,因为它可以大大地提高开发的效率.那么大家就