我和我追逐的夢(mèng)
前面教程中有個(gè)章節(jié)討論到mock和stub的概念差別,一般來說easymock如其名所示,主要是用來做mock用的,但是easymock中也提供有對(duì)stub的支持, 主要體現(xiàn)在andStubAnswer(),andStubDelegateTo(),andStubReturn(),andStubThrow()和asStub()等方法的使用上。
我們來看一個(gè)實(shí)際使用的例子:
這里的Business類依賴到Service和StubService,execute1() / execute2() / execute3() 是我們需要測(cè)試的三個(gè)方法,相同點(diǎn)都是必須調(diào)用service.execute(),不同點(diǎn)在于其后對(duì)stubService的調(diào)用各不相同。而我們假設(shè)在這里我們只關(guān)心Business類對(duì)Service的調(diào)用是否如預(yù)期,不關(guān)心對(duì)于StubService的調(diào)用,只要程序可以繼續(xù)運(yùn)行就可以了。
一個(gè)正統(tǒng)的做法是手工寫一個(gè)StubService的stub 實(shí)現(xiàn),例如:
但是如果這個(gè)接口復(fù)雜方法眾多,則這個(gè)stub類不得不實(shí)現(xiàn)所有的其他方法,即使完全用不到,因?yàn)閖ava的語法限制。
可以這樣使用easymock來實(shí)現(xiàn)stub:
在方法prepareStubService()中,我們通過easymock創(chuàng)建了一個(gè)mock對(duì)象,然后和普通mock對(duì)象一樣記錄了期望的行為。不同的是用andStubReturn()替代了andReturn().
然后我們直接調(diào)用EasyMock.replay(service),注意在這個(gè)測(cè)試案例中,我們另外創(chuàng)建了一個(gè)mocksControl并通過這個(gè)mocksControl創(chuàng)建了我們關(guān)注的Service接口的mock對(duì)象,它的record/replay/和verify()是和StubService完全分離的。這樣做的好處是在execute1() / execute2() / execute3()的測(cè)試案例中,我們完全不必額外關(guān)心這個(gè)stub,所有的事情在init()函數(shù)中就已經(jīng)準(zhǔn)備好了。這樣做的好處顯而易見,execute1() / execute2() / execute3()的測(cè)試案例中,代碼和測(cè)試邏輯都簡(jiǎn)單了。
最后總結(jié),在適當(dāng)?shù)臅r(shí)候使用easymock來創(chuàng)建stub對(duì)象,對(duì)于簡(jiǎn)化測(cè)試還是能有所幫助的。
posted on 2010-11-23 17:51 sky ao 閱讀(2139) 評(píng)論(0) 編輯 收藏 所屬分類: software test
Powered by: BlogJava Copyright © sky ao