前段日子很無聊,也是很無奈的。經過了這段日子的,我想了很多事情,雖然全部想通,但卻努力的去想了。我想這樣就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 {}
-
- }
上面就是我第一次很認真的測試,有很多不明白的地方 |