路是爬出来的

我的第一个真正意义上的测试

       前段日子很无聊,也是很无奈的。经过了这段日子的,我想了很多事情,虽然全部想通,但却努力的去想了。我想这样就Ok了

对吗?

       好了。前阵子,老板请喝早茶,顺便跟我们这些技术人员讨论了怎么样可以提高我们内功的问题。我老板也是技术出身的。有相当多的经验,当然我最初的想法并不是去研究测试,我直接提出:“我觉得我们应该提高我们对设计模式的理解”。他却不怎么同意,说测试才是我们现在的当务之急,然后很肯定的说。TDD,重构都是建立再单元测试基础上的。并推翻了我的建议:”有空让对设计模式有深厚理解的员工给我们上课“。

       开始由于我个人原因,或许我是个很情绪话的员工,也许在另外一家公司我可能早就被T。也许老板对我太好了。^_^

我当时不怎么响应,总是做自己喜欢做的事情,后来自己慢慢觉得自己的工作态度不对,所以昨天试着努力纠正自己的错误,真是在这样的环境下,自己写出了自己第一个我认为真正意义上的测试,把它记录下来。

       测试的要求:

       测试对一个Account的Dao操作以及Service。

java 代码


 


  1. //先来测试最基本的dao吧  

  2. package org.wuhua.dao;  

  3.   

  4. import java.util.Collection;  

  5.   

  6. public interface IBaseDao {  

  7.     Object save(Object o);  

  8.     void delete(Object o);  

  9.     Object update(Object o);  

  10.     Collection list();  

  11. }  



根据我的理解,测试的对方要跟mock的对象分开,(开始我一直认为你要mock的对象就是你要测试的东西,搞着搞着,我就很迷茫了。)。现在要做的就是看你IBaseDao的实现是什么了。如果实现是采用SpringHibernateTemplate的话你就去mock一个这样对象,不过此对象并不是接口,所以你要用到easymock的扩展包,以对它的支持。如果你实现的采用纯Hibernate的话。那你就去mock一个SessionFactory吧。很简单吧,难道这就是所谓的解耦吗?我想是的,这正是解耦。 哈哈



看下我的实现吧,采用Spring实现。

java 代码


 


  1. package org.wuhua.dao.impl;  

  2.   

  3. import java.util.Collection;  

  4.   

  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  

  6. import org.wuhua.dao.IBaseDao;  

  7.   

  8. public class BaseDao extends  HibernateDaoSupport  

  9. implements IBaseDao {  

  10.   

  11.     public void delete(Object o) {  

  12.          this.getHibernateTemplate().delete(o);        

  13.     }  

  14.   

  15.     public Collection list() {  

  16.        

  17.         return null;  

  18.     }  

  19.   

  20.     public Object save(Object o) {  

  21.         return this.getHibernateTemplate().save(o);  

  22.             

  23.     }  

  24.   

  25.     public Object update(Object o) {  

  26.         this.getHibernateTemplate().update(o);  

  27.         return o;  

  28.     }  

  29.   

  30. }  



测试代码

java 代码


 


  1. package org.wuhua.dao;  

  2.   

  3. import java.io.Serializable;  

  4.   

  5. import junit.framework.TestCase;  

  6.   

  7. import org.easymock.MockControl;  

  8. import org.easymock.classextension.MockClassControl;  

  9. import org.springframework.orm.hibernate3.HibernateTemplate;  

  10. import org.wuhua.dao.impl.BaseDao;  

  11.   

  12. public class BaseDaoTest extends TestCase {  

  13.   

  14.     MockControl control;  

  15.   

  16.     private HibernateTemplate ht;  

  17.   

  18.     private BaseDao baseDao;  

  19.   

  20.     protected void setUp() throws Exception {  

  21.         control = MockClassControl.createControl(HibernateTemplate.class);  

  22.         ht = (HibernateTemplate) control.getMock();  

  23.         baseDao = new BaseDao();  

  24.         baseDao.setHibernateTemplate(ht);  

  25.     }  

  26.   

  27.     public void testSave() {  

  28.         Object o = new Object();  

  29.         ht.save(o); 


  30.         //这里我是有疑问的。

  31.         //1,为什么HibernateTemplate返回的是Serializable。

  32.         //2,设置的返回植为什么一定要跟调用ht.save(o)一致呢?


  33.         control.setReturnValue(new Wuhua());  

  34.         control.replay();  

  35.         baseDao.save(o);  

  36.         control.verify();  

  37.     }  

  38.       

  39.     public void testUpdate() {  

  40.         Object a = new Object();  

  41.         ht.update(a);  

  42.        

  43.         control.replay();  

  44.         try {  

  45.             baseDao.update(a);  

  46.             fail("Not catch exception!");  

  47.         } catch(Exception e) {  

  48.                

  49.         }  

  50.         control.verify();  

  51.     }  

  52.       

  53.     class Wuhua implements Serializable {}  

  54.   

  55. }  



上面就是我第一次很认真的测试,有很多不明白的地方

posted on 2006-12-30 09:24 路是爬出来的 阅读(190) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问