Java DAO层封装与测试实践

需积分: 50 5 下载量 157 浏览量 更新于2024-07-13 收藏 763KB PPT 举报
在Java开发中,"进行测试 - DAO层的编写" 是一个关键环节,特别是在单元测试和数据访问层的设计中。在这个过程中,我们主要关注的是数据访问对象(DAO)的封装和测试类的创建。 首先,我们来看DAO层(Data Access Object Layer)。DAO是软件架构中的一种设计模式,它负责处理与数据库的交互,将复杂的数据库操作抽象为简单的接口。在Java中,创建一个具体的DAO实现类(如`DeptDAOImpl`),它实现了`DeptDAO`接口,这样可以方便地在多个地方复用这些数据访问逻辑,同时隐藏底层数据库操作的复杂性。例如,`DeptTest`类中通过`new DeptDAOImpl()`创建了一个DAO实例,并调用其`add`方法进行数据添加操作。 命名规则在这一阶段很重要,遵循帕斯卡命名法,例如,数据库表名为DEPT的实体类称为Dept,去除不必要的前缀和下划线。此外,数据库表中的字段映射到实体类的属性,确保字段类型匹配,如数字字段用int或double,非数字字段用String类型。 接下来是测试类的创建。在测试驱动开发(TDD)的理念下,我们会为每一个业务层服务(如`add`方法)创建一个测试类,如`DeptTest`。这个类通常位于`test`包下,遵循实体类名后加`Test`的命名规则。测试类的主要目的是验证DAO层的方法是否按预期工作,确保数据的正确存储和操作。在`main`方法中,我们编写测试用例,比如插入一个新的`Dept`对象,然后检查操作结果是否符合预期。 数据封装和操作封装是两个核心概念。数据封装是将数据库查询结果转换为Java对象,存储在实体类(如`Emp`类)的属性中,使得数据处理更为直观和易于管理。操作封装则是将一系列数据库操作整合到单个方法中,如`add`,以便在其他部分的代码中只需调用该方法即可执行相应的操作。 包结构方面,通常会将实体类放在`entity`包下,数据访问操作类放在`dao`包,业务逻辑相关的类放在`biz`包,而公共类放在`comm`包。`test`包用于存放测试类,它们按照被测试类的名称进行命名。 最后,创建实体类时,应遵循命名约定并确保类和数据库表的对应关系清晰,这有助于后续的开发和维护。通过这样的设计,不仅提高了代码的可读性和可维护性,也便于单元测试的进行,从而确保整个系统的稳定性和质量。
2008-03-14 上传
对DAO编写单元测试,其中的如下
package com.javaeedev.dao.impl;

import java.util.List;
import java.util.UUID;

import com.javaeedev.dao.UserDao;
import com.javaeedev.domain.PasswordTicket;
import com.javaeedev.domain.User;
import com.javaeedev.exception.LockException;
import com.javaeedev.util.HibernateUtil;

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);
}

public void updateUser(User user) {
HibernateUtil.updateEntity(user);
}

public boolean updateEmailValidation(String username, int ticket) {
if(ticket==0)
return false;
return 1==HibernateUtil.executeUpdate(
"update User as u set u.emailValidation=0 where u.username=? and u.emailValidation=?",
new Object[] { username, ticket }
);
}

public String createPasswordTicket(User user) {
HibernateUtil.executeUpdate(
"delete from PasswordTicket as pt where pt.user=?",
new Object[] { user }
);
String ticket = UUID.randomUUID().toString().replaceAll("\\-", "");
PasswordTicket pt = new PasswordTicket();
pt.setUser(user);
pt.setTicket(ticket);
pt.setCreatedDate(System.currentTimeMillis());
HibernateUtil.createEntity(pt);
return ticket;
}

public boolean updatePassword(String username, String oldPassword, String newPassword) {
if(!newPassword.matches(User.REGEX_PASSWORD))
return false;
return 1==HibernateUtil.executeUpdate(
"update User as u set u.password=? where u.username=? and u.password=?",
new Object[] { newPassword, username, oldPassword }
);
}

public boolean queryResetPassword(User user, String ticket) {
long time = System.currentTimeMillis() - 48L * 3600000L;
return !HibernateUtil.queryForList(
"select pt from PasswordTicket as pt where pt.user=? and pt.ticket=? and pt.createdDate>?",
new Object[] { user, ticket, time}
).isEmpty();
}

@SuppressWarnings("unchecked")
public boolean updateResetPassword(User user, String ticket, String password) {
if(!password.matches(User.REGEX_PASSWORD))
return false;
long time = System.currentTimeMillis() - 48L * 3600000L;
List<PasswordTicket> list = HibernateUtil.queryForList(
"select pt from PasswordTicket as pt where pt.user=? and pt.ticket=? and pt.createdDate>?",
new Object[] { user, ticket, time}
);
if(list.isEmpty())
return false;
HibernateUtil.executeUpdate(
"delete from PasswordTicket as pt where pt.user=?",
new Object[] { user }
);
HibernateUtil.executeUpdate(
"update User as u set u.password=? where u.username=?",
new Object[] { password, user.getUsername() }
);
return true;
}

public void updateLock(User user, long lockTime) {
HibernateUtil.executeUpdate(
"update User as u set u.lockDate=? where u.username=?",
new Object[] { System.currentTimeMillis() + lockTime, user.getUsername() }
);
}

public void updateUnlock(User user) {
HibernateUtil.executeUpdate(
"update User as u set u.lockDate=0 where u.username=?",
new Object[] { user.getUsername() }
);
}

}