在寫單元測驗的時候,不免可能需要mock一些物件出來,并且mock一些方法呼叫去回傳一個自己想要的物件,一般的使用是這樣的:
FinalPumpkin pumpkin = mock(FinalPumpkin.class);
when(pumpkin.getName()).thenReturn("www.pkslow.com");
這樣我們便可以自定義這個類getName()方法的回傳,以達到我們測驗特定情況的需要,
但假設可能我們要影響的是下面這樣的回傳結果呢?
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可以實作如下簡潔辦法:
@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獲取更多精彩文章!
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/191465.html
標籤:Java
上一篇:Java筆記:Java面向物件
