无花的空间--http://wuhua.3geye.net-- 您今天UCWEB了吗?--http://www.ucweb.com

当你来到我的空间的时候,你会看到很多Google,Nokia,Mobile,J2ME ,Android,3G,无线开发,手机软件,手机软件开发等与Google,手机相关的文章,你千万不要惊讶。这就是我一个专注Google,无线开发的无花。传播知识,分享经验,技术交流是我开空间的直接目的。当然如果有项目开发,我还是很希望赚点外快的。

用户操作
[即时聊天] [发私信] [加为好友]
无花ID:gooogledev
40542次访问,排名2971,好友20人,关注者24人。
J2EE 2年的开发时间,
J2ME 2年的开发时间
gooogledev的文章
原创 80 篇
翻译 0 篇
转载 3 篇
评论 201 篇
无花的公告

人要吃很多苦才可以长大!

踏实平凡人应该遵守的原则!

与我TM

gooogledev@gmail.com

友情链接

我的j2me创意

Wap浏览器的源代码

用自己写的rms引擎写的电话本

RSS订阅此博客  
用抓虾订阅此博客
用google订阅此博客
用bloglines订阅此博客
    网络封神榜 | 饶荣庆
最近评论
22:main()在哪个.java中
ant-shopping:I support author's viewpoint, hoped that will have later also more better articles,
abercrombie fitch handbag
ptsell:I support author's viewpoint, hoped that will have later also more better articles,
Balenciaga Bags
真的假的,屁股上的痣也能拍出来?
leo2012:奇怪,怎么下的wap explorer不能访问wap站点
文章分类
收藏
    相册
    j2me创意图片
    j2me教程
    我的照片
    我的链接
    3G视线
    EasyMF J2ME框架
    Lucene中国
    我的Google
    无花的博客
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创  单元测试之实践二,关于DAO的测试收藏

    新一篇: 单元测试之实践三 Service的测试 | 旧一篇: 单元测试之测试目的

     前阵子发表过 我的第一个真正意义上的测试
    里面对于测试Service大家是没有意义的,对于测试DAO层则表现各有各的看法。
    比如
    robbin 大哥建议:

    测试DAO不如连数据库一起测试吧。因为DAO测试的目的不是DAO接口实现对不对,而是测试是否如你预期的发送了SQL,如你预期的返回了结果集。这个时候你Mock之后,测试就没有意义了。

    hyysguyang 大哥建议:篇
    wuhua 写道
    分层的原因很多。这里我的看法片面就不说了
    但对于mock来说是有莫大好处的。
    比如service测试的时候完全可以做到隔离数据库,

    我现在的意思是,
    居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗

    但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。
    事实上,最原始的单元测试(plain testcase)就是用来测方法,测业务逻辑的,如果有逻辑就测,没逻辑就不用测了,同样的道理,相信你不会去测一个bean的get/set方法吧。
    记住你测试的目的和动机,如果你认为测试dao层是为了测你的逻辑(你确定你的dao的实现代码是否真的存在逻辑),那你就mock吧,但是,我们更相信,我们测DAO层,更应该是测访问数据库的情况,你如连接,sql是否正确,sequence是否正确等,而这些你必须要真正的连接数据库,也因此,我们一般都是直接访问数据库来测试的,当然,如果可能你可以采用内存库。
    事实上,我们对dao的测试,一般都进行所谓的的集成单元测试。我认为,你应该确定好你的测试策略,然后在去采用相应的测试方法。我在目前的开发中就是采用这样的方式测的。

    上面两个大哥都建议测试DAO的时候还是连接数据库为好。
    但个人认为上面两个大哥的单元测试以非纯正的单元测试了,而是集成单元测试。
    其实说白了,测试这东西只是为了项目更好,更快的完成。至于是否要求纯单元,或者是集成单元测试,则看各位的需要,如果觉得集成单元测试对项目有帮助,那就用吧,现在发现对这个已经没有明显的界限了。


    不理会它了,现在回归到我们用户注册的例子。
    java 代码
    1. 1. public interface IAccountDao extends IBaseDao {
    2. 2. public Account findAccountById(String id);
    3. 3. public Account findAccounByName(String name);
    4. 4. }

    实际实现代码
    java 代码
    1. package org.wuhua.dao.impl;

    2. import java.util.List;

    3. import org.wuhua.dao.IAccountDao;
    4. import org.wuhua.model.Account;

    5. public class AccountDao extends BaseDao implements IAccountDao {
    6. public Account findAccountById(String id) {
    7. return (Account) this.getHibernateTemplate().get(Account.class, id) ;
    8. }

    9. public Account findAccounByName(String name) {
    10. List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);
    11. if(l != null && l.size() >=1)
    12. return (Account) l.get(0);
    13. else
    14. return null;
    15. }
    16. }

    java 代码
    1. package org.wuhua.dao;

    2. import java.util.ArrayList;
    3. import java.util.List;

    4. import junit.framework.Assert;
    5. import junit.framework.TestCase;

    6. import org.easymock.MockControl;
    7. import org.easymock.classextension.MockClassControl;
    8. import org.springframework.orm.hibernate3.HibernateTemplate;
    9. import org.wuhua.dao.impl.AccountDao;
    10. import org.wuhua.model.Account;



    11. public class AccountDaoTest extends TestCase {

    12. private AccountDao accountDao;
    13. private org.springframework.orm.hibernate3.HibernateTemplate ht;
    14. private MockControl control;

    15. protected void setUp() throws Exception {
    16. control = MockClassControl.createControl(HibernateTemplate.class);
    17. ht = (HibernateTemplate) control.getMock();
    18. accountDao = new AccountDao();
    19. accountDao.setHibernateTemplate(ht);
    20. }

    21. protected void tearDown() throws Exception {

    22. }

    23. public void testFindAccountById(){
    24. Account a = new Account("wuhua");
    25. a.setId("10");

    26. ht.get(Account.class, a.getId());

    27. control.setReturnValue(a);

    28. control.replay();

    29. Account result = accountDao.findAccountById(a.getId());

    30. assertNotNull(result);

    31. Assert.assertEquals(a.getId(),result.getId());
    32. Assert.assertEquals(a, result);

    33. control.verify();

    34. }

    35. public void testFindAccountByName(){
    36. Account a = new Account("wuhua");

    37. ht.find("from Account as a where a.name=?", a.getName());
    38. List l = new ArrayList();
    39. l.add(a);
    40. control.setReturnValue(l);

    41. control.replay();

    42. Account result = accountDao.findAccounByName(a.getName());

    43. Assert.assertEquals(a.getId(),result.getId());
    44. Assert.assertEquals(a, result);

    45. control.verify();

    46. }
    47. }
     

    发表于 @ 2007年04月03日 16:16:00|评论(loading...)|编辑

    新一篇: 单元测试之实践三 Service的测试 | 旧一篇: 单元测试之测试目的

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 无花