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