部分模擬:在Mockito 中模擬特定方法
測試類別時,可能需要僅模擬某些方法,同時保留行為其他人的。在 Mockito 中,這是透過「部分模擬」實現的,其中模擬了一系列方法,而未模擬的方法則按預期執行。
考慮以下Stock 類,其中包含getPrice()、getQuantity() 和getValue( ) 方法:
public class Stock { ... public double getValue() { return getPrice() * getQuantity(); } }
在測試案例中,如果我們希望模擬getPrice() 和getQuantity( ) 方法但保留getValue()要正常執行,我們可以定義一個部分模擬,如下所示:
Stock stock = mock(Stock.class); when(stock.getPrice()).thenReturn(100.00); when(stock.getQuantity()).thenReturn(200); when(stock.getValue()).thenCallRealMethod();
這裡, getPrice() 和getQuantity() 方法有模擬實現,而getValue() 執行與原始Stock 中一樣
或者,使用「spy」 API:
Stock stock = spy(Stock.class); when(stock.getPrice()).thenReturn(100.00); when(stock.getQuantity()).thenReturn(200);
所有其他方法調用,在本例中為getValue(),使用真正的實作。
為了確保不呼叫真正的方法並且一致地應用模擬邏輯,請考慮以下替代表示法:
doReturn(100.00).when(stock).getPrice(); doReturn(200).when(stock).getQuantity();
但是,需要注意的是,在此範例中,getValue( ) 方法直接依賴價格和數量,而不是它們的getter。因此,模擬 getPrice() 和 getQuantity() 可能仍然無法產生所需的行為。
另一種方法是完全避免模擬,而是依賴Stock 類別的直接實例化:
Stock stock = new Stock(100.00, 200); double value = stock.getValue();
透過建立真實實例,我們可以確保getValue() 根據實際價格和數量值按預期執行。
以上是如何在 Mockito 中部分模擬方法:在保留其他方法的同時模擬特定方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!