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