在寫單元測試的時候,難免可能須要mock一些對象出來,而且mock一些方法調用去返回一個本身想要的對象。通常的使用是這樣的:java
FinalPumpkin pumpkin = mock(FinalPumpkin.class); when(pumpkin.getName()).thenReturn("www.pkslow.com");
這樣咱們即可以自定義這個類getName()
方法的返回,以達到咱們測試特定狀況的須要。web
但假設可能咱們要影響的是下面這樣的返回結果呢?微信
pumpkin.getWeb().getFactory().getContainer().getHostname()
那可能咱們就要先mock四個對象出來,而後再一層層mock方法的返回結果了。以下:單元測試
FinalPumpkin pumpkin = mock(FinalPumpkin.class); Web web = mock(Web.class); Factory factory = mock(Factory.class); Container container = mock(Container.class); when(pumpkin.getWeb()).thenReturn(web); when(web.getFactory()).thenReturn(factory); when(factory.getContainer()).thenReturn(container); when(container.getHostname()).thenReturn("www.pkslow.com");
這可夠麻煩的。測試
幸虧Mockito
也想到這種狀況,提供瞭解決辦法,mock
對象的時候增長參數RETURNS_DEEP_STUBS
能夠實現以下簡潔辦法:spa
@Test public void testChainMethod() { FinalPumpkin pumpkin = mock(FinalPumpkin.class, RETURNS_DEEP_STUBS); when(pumpkin.getWeb().getFactory().getContainer().getHostname()) .thenReturn("www.pkslow.com"); verify(pumpkin.getWeb(), atLeastOnce()); }
注意:若是有返回值爲泛型,會報ClassCastException
的錯誤,這時須要拆開,把返回類型強制轉換爲Object
類。
歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!code
歡迎關注微信公衆號<南瓜慢說>,將持續爲你更新...對象
多讀書,多分享;多寫做,多整理。get