您所在的位置: 首页>>开发>>测试>>

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

http://developer.51cto.com  2007-08-22 13:06  廖雪峰  天极社区  我要评论(0)
  • 摘要:本文针对DAO组件给出一种较为合适的单元测试的编写策略。在JavaEE开发网的开发过程中,为了对DAO组件进行有效的单元测试,我们采用HSQLDB这一小巧的纯Java数据库作为测试时期的数据库环境,配合Ant,实现了自动生成数据库脚本,测试前自动初始化数据库,极大地简化了DAO组件的单元测试的编写。
  • 标签:单元  测试  DAO  组件  J2EE

实体类PasswordTicket代表一个重置口令的请求:

@Entity
@Table(name="T_PWDT")
public class PasswordTicket {
private String id;
private User user;
private String ticket;
private long createdDate;
@Id
@Column(nullable=false, updatable=false,  length=32)
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid",  strategy="uuid")
public String getId() {  return id; }
protected void  setId(String id) { this.id = id; }
@ManyToOne
@JoinColumn(nullable=false, updatable=false)
public User getUser() {  return user; }
public void setUser(User  user) { this.user = user; }
@Column(nullable=false,  updatable=false, length=32)
public String getTicket()  { return ticket; }
public void  setTicket(String ticket) { this.ticket = ticket; }
@Column(nullable=false,  updatable=false)
public long  getCreatedDate() { return createdDate; }
public void  setCreatedDate(long createdDate) { this.createdDate = createdDate; }
}

UserDao接口定义了对用户的相关操作:

 public interface UserDao {
User  queryForSignOn(String username);
User queryUser(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;
}

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

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

图2


共4页: 上一页 [1] 2 [3] [4] 下一页
【内容导航】
测试开发人员参考手册
J2EE实用技巧大全
专题:网络性能测试
J2EE应用开发专栏
网络布线测试仪器
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有