前段日子很无聊,也是很无奈的。经过了这段日子的,我想了很多事情,虽然全部想通,但却努力的去想了。我想这样就Ok了
对吗?
好了。前阵子,老板请喝早茶,顺便跟我们这些技术人员讨论了怎么样可以提高我们内功的问题。我老板也是技术出身的。有相当多的经验,当然我最初的想法并不是去研究测试,我直接提出:“我觉得我们应该提高我们对设计模式的理解”。他却不怎么同意,说测试才是我们现在的当务之急,然后很肯定的说。TDD,重构都是建立再单元测试基础上的。并推翻了我的建议:”有空让对设计模式有深厚理解的员工给我们上课“。
开始由于我个人原因,或许我是个很情绪话的员工,也许在另外一家公司我可能早就被T。也许老板对我太好了。^_^
我当时不怎么响应,总是做自己喜欢做的事情,后来自己慢慢觉得自己的工作态度不对,所以昨天试着努力纠正自己的错误,真是在这样的环境下,自己写出了自己第一个我认为真正意义上的测试,把它记录下来。
测试的要求:
测试对一个Account的Dao操作以及Service。
java 代码
-
- package org.wuhua.dao;
-
- import java.util.Collection;
-
- public interface IBaseDao {
- Object save(Object o);
- void delete(Object o);
- Object update(Object o);
- Collection list();
- }
根据我的理解,测试的对方要跟mock的对象分开,(开始我一直认为你要mock的对象就是你要测试的东西,搞着搞着,我就很迷茫了。)。现在要做的就是看你IBaseDao的实现是什么了。如果实现是采用SpringHibernateTemplate的话你就去mock一个这样对象,不过此对象并不是接口,所以你要用到easymock的扩展包,以对它的支持。如果你实现的采用纯Hibernate的话。那你就去mock一个SessionFactory吧。很简单吧,难道这就是所谓的解耦吗?我想是的,这正是解耦。 哈哈
看下我的实现吧,采用Spring实现。
java 代码
- package org.wuhua.dao.impl;
-
- import java.util.Collection;
-
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.wuhua.dao.IBaseDao;
-
- public class BaseDao extends HibernateDaoSupport
- implements IBaseDao {
-
- public void delete(Object o) {
- this.getHibernateTemplate().delete(o);
- }
-
- public Collection list() {
-
- return null;
- }
-
- public Object save(Object o) {
- return this.getHibernateTemplate().save(o);
-
- }
-
- public Object update(Object o) {
- this.getHibernateTemplate().update(o);
- return o;
- }
-
- }
测试代码
java 代码
- package org.wuhua.dao;
-
- import java.io.Serializable;
-
- import junit.framework.TestCase;
-
- import org.easymock.MockControl;
- import org.easymock.classextension.MockClassControl;
- import org.springframework.orm.hibernate3.HibernateTemplate;
- import org.wuhua.dao.impl.BaseDao;
-
- public class BaseDaoTest extends TestCase {
-
- MockControl control;
-
- private HibernateTemplate ht;
-
- private BaseDao baseDao;
-
- protected void setUp() throws Exception {
- control = MockClassControl.createControl(HibernateTemplate.class);
- ht = (HibernateTemplate) control.getMock();
- baseDao = new BaseDao();
- baseDao.setHibernateTemplate(ht);
- }
-
- public void testSave() {
- Object o = new Object();
- ht.save(o);
- //这里我是有疑问的。
- //1,为什么HibernateTemplate返回的是Serializable。
- //2,设置的返回植为什么一定要跟调用ht.save(o)一致呢?
- control.setReturnValue(new Wuhua());
- control.replay();
- baseDao.save(o);
- control.verify();
- }
-
- public void testUpdate() {
- Object a = new Object();
- ht.update(a);
-
- control.replay();
- try {
- baseDao.update(a);
- fail("Not catch exception!");
- } catch(Exception e) {
-
- }
- control.verify();
- }
-
- class Wuhua implements Serializable {}
-
- }
上面就是我第一次很认真的测试,有很多不明白的地方 |