快速业务通道

对J2EE中的DAO组件编写单元测试 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
yUser(String username); void createUser(User user); void updateUser(User user); boolean updateEmailValidation(String username, int ticket); String createPasswordTicket(User user); boolean updatePassword(String username, String oldPassword, String newPassword); boolean queryResetPassword(User user, String ticket); boolean updateResetPassword(User user, String ticket, String password); void updateLock(User user, long lockTime); void updateUnlock(User user); }

UserDaoImpl是其实现类:

public class UserDaoImpl implements UserDao { public User queryForSignOn(String username) { User user = queryUser(username); if(user.getLocked()) throw new LockException(user.getLockDate()); return user; } public User queryUser(String username) { return (User) HibernateUtil.query(User.class, username); } public void createUser(User user) { user.setEmailValidation((int)(Math.random() * 1000000) + 0xf); HibernateUtil.createEntity(user); } // 其余方法略 ... }

由于将Hibernate事务绑定在Thread上,因此,实际的客户端调用DAO组件时,还必须加入事务代码:

Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); try { dao.xxx(); tx.commit(); } catch(Exception e) { tx.rollback(); throw e; }

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

时间:2011-03-06 廖雪峰

下面,我们开始对DAO组件编写单元测试。前面提到了HSQLDB这一小巧的纯Java数据库。HSQLDB除了提供完整的JDBC驱动以及事务支持外,HSQLDB还提供了进程外模式(与普通数据库类似)和进程内模式(In-Process),以及文件和内存两种存储模式。我们将HSQLDB设定为进程内模式及仅使用内存存储,这样,在运行JUnit测试时,可以直接在测试代码中启动HSQLDB。测试完毕后,由于测试数据并没有保存在文件上,因此,不必清理数据库。

此外,为了执行批量测试,在每个独立的DAO单元测试运行前,我们都执行一个初始化脚本,重新建立所有的表。该初始化脚本是通过HibernateTool自动生成的,稍后我们还会讨论。下图是单元测试的执行顺序:

对J2EE中的DAO组件编写单元测试 - 编程入门网

在编写测试类之前,我们首先准备了一个TransactionCallback抽象类,该类通过Template模式将DAO调用代码通过事务包装起来:

public abstract class TransactionCallback { public final Object execute() throws Exception { Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); try { Object r = doInTransaction(); tx.commit(); return r; } catch(Exception e) { tx.rollback(); throw e; } } // 模板方法: protected abstract Object doInTransaction() throws Exception; }

其原理是使用JDK提供的动态代理。由于JDK的动态代理只能对接口代理,因此,要求DAO组件必须实现接口。如果只有具体的实现类,则只能考虑CGLIB之类的第三方库,在此我们不作更多讨论。

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

时间:2011-03-06 廖雪峰

下面我们需要编写DatabaseFixture,负责启动HSQLDB数据库,并在@Before方法中初始化数据库表。该DatabaseFixture可以在所有的DAO组件的单元测试类中复用:

public class DatabaseFixture { private static Server server = null; // 持有HSQLDB的实例 private static final String DATABASE_NAME = "javaeedev"; // 数据库名称 private static final String SCHEMA_FILE = "schema.sql"; // 数据库初始化脚本 private static final List&

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号