Mockito如何mock一條鏈式調用


在寫單元測試的時候,不免可能需要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獲取更多精彩文章!

歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM