DAO单元测试

今天我将展示一下我是如何在实际中对dao进行单元测试的
首先我们来确认一下dao需要什么样的环境,我的dao是用Spring+hibernate来构建的,而对应的数据源是oracle9。所以要进行dao的测试我需要从Spring的连接oracle的context中获取dao的实例出来,这里我使用的是spring-mock
spring-mock使用比较简单的,只需要设置spring的配置文件路径就可以获得上下文了
这里需要注意的是这个spring上下文是ClassPathApplicationContext,而我们在web环境中经常遇到的是WebApplicationContext
/** */ /**
 * $Id:$
 *
 * Copyright 2005 easou, Inc. All Rights Reserved.
 
*/

package  test.spring.common;

import  org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

import  test.PathConfig;

public   class  BaseSpringTestCase  extends
        AbstractTransactionalDataSourceSpringContextTests 
{    

    @Override
    
protected String[] getConfigLocations() {

        String[] config 
= PathConfig.springxml;

        
return config;

    }
        
    
public void testConfig() {        
        assertNotNull(
"spring-mock context has bean init()",this.applicationContext);
    }


}
这里testConfig是用来检查你spring配置的加载是否正确的

下面给出一个DAO的简单查询方法
public  List getHomepageAreasByChannelId( long  channelId)  {

        
return this.executeHQL(" from CsHomepageArea  h where h.csChannel.id='"
                
+ channelId + "' order by h.theOrder");
    }


上面的方法指示根据一个id取列表出来,而我们要测试的目标有(其实也就是我们这个方法要实现的目标):
1、给出正确的id是否能否返回正确的结果
2、返回的结果集能够根据hibernate配置文件而得到我们期望的结果集(比如说对子集的lazy读取)
3、返回的结果集是否按照你所期望的排序
4、给出错误的id是否在获取数据时会出错
根据上面的测试目标我们就很容易的得到下面的测试方法了

public   void  testGetHomepageAreasByChannelId()  {
        List list 
= channelDAO.getHomepageAreasByChannelId(1);
        assertNotNull(
"homepage list is not null", list);
        CsHomepageArea homepage 
= (CsHomepageArea) list.get(0);
        assertNotNull(
"homepage'name is not null", homepage.getName());
        assertNotNull(
"homepage'channel has been lazy", homepage.getCsChannel()
                .getName());
        assertNotNull(
"homepage'column has been lazy", homepage.getCsColumn()
                .getName());
        assertNotNull(
"homepage'subject has been lazy", homepage
                .getCsSubjects().iterator().next().getName());
        CsSubject subject 
= (CsSubject) homepage.getCsSubjects().iterator()
                .next();
        assertNotNull(
"homepage'subject'keyword has been lazy", subject
                .getCsSubjectKeywords().iterator().next().getName());

    }

对于DAO层的查询方法,我们测试的就是判断返回的数据是否是我们需要的

下面这个方法是DAO的增改方法,和删除方法

public   void  saveComment(CsComment comment)  {
        getHibernateTemplate().saveOrUpdate(comment);        
    }

    
public   void  deleteComment(CsComment comment)  {        
        getHibernateTemplate().delete(comment);        
    }

 

对于这种无返回值得方法我们主要测试的是:
1、对于正确的数据是否能够正确的存入数据库或者从数据库删除
2、对于错误的数据操作能够有错误信息(如主键重复)

public   void  testSaveComment() {
        CsComment comment 
= new CsComment();
        comment.setCommentDate(
new Date());
        comment.setContent(
"comment test");
        channelDAO.saveComment(comment);
        CsComment dbComment 
=(CsComment)channelDAO.getEntity(comment.getId());
        assertNotNull(
"comment has bean saved", dbComment);
    }

    
public   void  testDeleteComment() {
        CsComment comment 
= new CsComment();
        comment.setId(
new Long(13));
        channelDAO.delete(comment);
        CsComment dbComment 
=(CsComment)channelDAO.getEntity(comment.getId());
        assertNull(
"comment has bean delete", dbComment);
    }

其实这种save或者delete的方法由于使用时都是基本调用hibernate的方法,所以在我看来测试的意义并不是很大
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DAO编写单元测试,其中的如下<br>package com.javaeedev.dao.impl;<br><br>import java.util.List;<br>import java.util.UUID;<br><br>import com.javaeedev.dao.UserDao;<br>import com.javaeedev.domain.PasswordTicket;<br>import com.javaeedev.domain.User;<br>import com.javaeedev.exception.LockException;<br>import com.javaeedev.util.HibernateUtil;<br><br>public class UserDaoImpl implements UserDao {<br><br> public User queryForSignOn(String username) {<br> User user = queryUser(username);<br> if(user.getLocked())<br> throw new LockException(user.getLockDate());<br> return user;<br> }<br><br> public User queryUser(String username) {<br> return (User) HibernateUtil.query(User.class, username);<br> }<br><br> public void createUser(User user) {<br> user.setEmailValidation((int)(Math.random() * 1000000) + 0xf);<br> HibernateUtil.createEntity(user);<br> }<br><br> public void updateUser(User user) {<br> HibernateUtil.updateEntity(user);<br> }<br><br> public boolean updateEmailValidation(String username, int ticket) {<br> if(ticket==0)<br> return false;<br> return 1==HibernateUtil.executeUpdate(<br> "update User as u set u.emailValidation=0 where u.username=? and u.emailValidation=?",<br> new Object[] { username, ticket }<br> );<br> }<br><br> public String createPasswordTicket(User user) {<br> HibernateUtil.executeUpdate(<br> "delete from PasswordTicket as pt where pt.user=?",<br> new Object[] { user }<br> );<br> String ticket = UUID.randomUUID().toString().replaceAll("\\-", "");<br> PasswordTicket pt = new PasswordTicket();<br> pt.setUser(user);<br> pt.setTicket(ticket);<br> pt.setCreatedDate(System.currentTimeMillis());<br> HibernateUtil.createEntity(pt);<br> return ticket;<br> }<br><br> public boolean updatePassword(String username, String oldPassword, String newPassword) {<br> if(!newPassword.matches(User.REGEX_PASSWORD))<br> return false;<br> return 1==HibernateUtil.executeUpdate(<br> "update User as u set u.password=? where u.username=? and u.password=?",<br> new Object[] { newPassword, username, oldPassword }<br> );<br> }<br><br> public boolean queryResetPassword(User user, String ticket) {<br> long time = System.currentTimeMillis() - 48L * 3600000L;<br> return !HibernateUtil.queryForList(<br> "select pt from PasswordTicket as pt where pt.user=? and pt.ticket=? and pt.createdDate>?",<br> new Object[] { user, ticket, time}<br> ).isEmpty();<br> }<br><br> @SuppressWarnings("unchecked")<br> public boolean updateResetPassword(User user, String ticket, String password) {<br> if(!password.matches(User.REGEX_PASSWORD))<br> return false;<br> long time = System.currentTimeMillis() - 48L * 3600000L;<br> List<PasswordTicket> list = HibernateUtil.queryForList(<br> "select pt from PasswordTicket as pt where pt.user=? and pt.ticket=? and pt.createdDate>?",<br> new Object[] { user, ticket, time}<br> );<br> if(list.isEmpty())<br> return false;<br> HibernateUtil.executeUpdate(<br> "delete from PasswordTicket as pt where pt.user=?",<br> new Object[] { user }<br> );<br> HibernateUtil.executeUpdate(<br> "update User as u set u.password=? where u.username=?",<br> new Object[] { password, user.getUsername() }<br> );<br> return true;<br> }<br><br> public void updateLock(User user, long lockTime) {<br> HibernateUtil.executeUpdate(<br> "update User as u set u.lockDate=? where u.username=?",<br> new Object[] { System.currentTimeMillis() + lockTime, user.getUsername() }<br> );<br> }<br><br> public void updateUnlock(User user) {<br> HibernateUtil.executeUpdate(<br> "update User as u set u.lockDate=0 where u.username=?",<br> new Object[] { user.getUsername() }<br> );<br> }<br><br>}<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值