前陣子發(fā)表過(guò) 我的第一個(gè)真正意義上的測(cè)試 。
里面對(duì)于測(cè)試Service大家是沒(méi)有意義的,對(duì)于測(cè)試DAO層則表現(xiàn)各有各的看法。
比如
測(cè)試DAO不如連數(shù)據(jù)庫(kù)一起測(cè)試吧。因?yàn)镈AO測(cè)試的目的不是DAO接口實(shí)現(xiàn)對(duì)不對(duì),而是測(cè)試是否如你預(yù)期的發(fā)送了SQL,如你預(yù)期的返回了結(jié)果集。這個(gè)時(shí)候你Mock之后,測(cè)試就沒(méi)有意義了。
wuhua 寫道
分層的原因很多。這里我的看法片面就不說(shuō)了
但對(duì)于mock來(lái)說(shuō)是有莫大好處的。
比如service測(cè)試的時(shí)候完全可以做到隔離數(shù)據(jù)庫(kù),
我現(xiàn)在的意思是,
居然Service可以隔離Dao層,也就是說(shuō)Dao層也是可以做到隔離相關(guān)的數(shù)據(jù)實(shí)現(xiàn)的。也是可以mock一個(gè)對(duì)象。而并非用實(shí)際的連接去代 替。如果我們的邏輯沒(méi)出錯(cuò)的話,測(cè)試就算通過(guò)了,至于數(shù)據(jù)層的檢測(cè),那就不關(guān)我們的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,別趟其他渾水。這樣不是瀟灑很多嗎
但是數(shù)據(jù)庫(kù)的測(cè)試畢竟比較特殊,記住測(cè)試的目的是確保你的代碼質(zhì)量,如果你確定你的這樣測(cè)就沒(méi)問(wèn)題了,那無(wú)話可說(shuō),否則就盡量多的測(cè)試。
事實(shí)上,最原始的單元測(cè)試(plain testcase)就是用來(lái)測(cè)方法,測(cè)業(yè)務(wù)邏輯的,如果有邏輯就測(cè),沒(méi)邏輯就不用測(cè)了,同樣的道理,相信你不會(huì)去測(cè)一個(gè)bean的get/set方法吧。
記住你測(cè)試的目的和動(dòng)機(jī),如果你認(rèn)為測(cè)試dao層是為了測(cè)你的邏輯(你確定你的dao的實(shí)現(xiàn)代碼是否真的存在邏輯),那你就mock吧,但是,我 們更相信,我們測(cè)DAO層,更應(yīng)該是測(cè)訪問(wèn)數(shù)據(jù)庫(kù)的情況,你如連接,sql是否正確,sequence是否正確等,而這些你必須要真正的連接數(shù)據(jù)庫(kù),也因 此,我們一般都是直接訪問(wèn)數(shù)據(jù)庫(kù)來(lái)測(cè)試的,當(dāng)然,如果可能你可以采用內(nèi)存庫(kù)。
事實(shí)上,我們對(duì)dao的測(cè)試,一般都進(jìn)行所謂的的集成單元測(cè)試。我認(rèn)為,你應(yīng)該確定好你的測(cè)試策略,然后在去采用相應(yīng)的測(cè)試方法。我在目前的開發(fā)中就是采用這樣的方式測(cè)的。
上面兩個(gè)大哥都建議測(cè)試DAO的時(shí)候還是連接數(shù)據(jù)庫(kù)為好。
但個(gè)人認(rèn)為上面兩個(gè)大哥的單元測(cè)試以非純正的單元測(cè)試了,而是集成單元測(cè)試。
其實(shí)說(shuō)白了,測(cè)試這東西只是為了項(xiàng)目更好,更快的完成。至于是否要求純單元,或者是集成單元測(cè)試,則看各位的需要,如果覺(jué)得集成單元測(cè)試對(duì)項(xiàng)目有幫助,那就用吧,現(xiàn)在發(fā)現(xiàn)對(duì)這個(gè)已經(jīng)沒(méi)有明顯的界限了。
不理會(huì)它了,現(xiàn)在回歸到我們用戶注冊(cè)的例子。
java 代碼
- 1. public interface IAccountDao extends IBaseDao {
- 2. public Account findAccountById(String id);
- 3. public Account findAccounByName(String name);
- 4. }
實(shí)際實(shí)現(xiàn)代碼
java 代碼
- package org.wuhua.dao.impl;
-
- import java.util.List;
-
- import org.wuhua.dao.IAccountDao;
- import org.wuhua.model.Account;
-
- public class AccountDao extends BaseDao implements IAccountDao {
- public Account findAccountById(String id) {
- return (Account) this.getHibernateTemplate().get(Account.class, id) ;
- }
-
- public Account findAccounByName(String name) {
- List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);
- if(l != null && l.size() >=1)
- return (Account) l.get(0);
- else
- return null;
- }
- }
java 代碼
- package org.wuhua.dao;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import junit.framework.Assert;
- import junit.framework.TestCase;
-
- import org.easymock.MockControl;
- import org.easymock.classextension.MockClassControl;
- import org.springframework.orm.hibernate3.HibernateTemplate;
- import org.wuhua.dao.impl.AccountDao;
- import org.wuhua.model.Account;
-
-
-
- public class AccountDaoTest extends TestCase {
-
- private AccountDao accountDao;
- private org.springframework.orm.hibernate3.HibernateTemplate ht;
- private MockControl control;
-
- protected void setUp() throws Exception {
- control = MockClassControl.createControl(HibernateTemplate.class);
- ht = (HibernateTemplate) control.getMock();
- accountDao = new AccountDao();
- accountDao.setHibernateTemplate(ht);
- }
-
- protected void tearDown() throws Exception {
-
- }
-
- public void testFindAccountById(){
- Account a = new Account("wuhua");
- a.setId("10");
-
- ht.get(Account.class, a.getId());
-
- control.setReturnValue(a);
-
- control.replay();
-
- Account result = accountDao.findAccountById(a.getId());
-
- assertNotNull(result);
-
- Assert.assertEquals(a.getId(),result.getId());
- Assert.assertEquals(a, result);
-
- control.verify();
-
- }
-
- public void testFindAccountByName(){
- Account a = new Account("wuhua");
-
- ht.find("from Account as a where a.name=?", a.getName());
- List l = new ArrayList();
- l.add(a);
- control.setReturnValue(l);
-
- control.replay();
-
- Account result = accountDao.findAccounByName(a.getName());
-
- Assert.assertEquals(a.getId(),result.getId());
- Assert.assertEquals(a, result);
-
- control.verify();
-
- }
- }
|