Per rispondere direttamente alla tua domanda, sì, puoi deridere alcuni metodi senza deridere altri. Questo si chiama derisione parziale . Vedere la documentazione di Mockito su simulazioni parziali per ulteriori informazioni.
Per il tuo esempio, puoi fare qualcosa come il seguente, nel tuo test:
Stock stock = mock(Stock.class);
when(stock.getPrice()).thenReturn(100.00); // Mock implementation
when(stock.getQuantity()).thenReturn(200); // Mock implementation
when(stock.getValue()).thenCallRealMethod(); // Real implementation
In tal caso, ogni implementazione del metodo viene derisa, a meno che non sia specificato thenCallRealMethod()
nella when(..)
clausola.
C'è anche una possibilità viceversa con spia invece di derisione :
Stock stock = spy(Stock.class);
when(stock.getPrice()).thenReturn(100.00); // Mock implementation
when(stock.getQuantity()).thenReturn(200); // Mock implementation
// All other method call will use the real implementations
In tal caso, tutte le implementazioni del metodo sono quelle reali, tranne se hai definito un comportamento beffardo con when(..)
.
C'è una trappola importante quando si usa la when(Object)
spia come nell'esempio precedente. Verrà chiamato il metodo reale (perché stock.getPrice()
viene valutato prima when(..)
in fase di esecuzione). Questo può essere un problema se il tuo metodo contiene una logica che non dovrebbe essere chiamata. Puoi scrivere l'esempio precedente in questo modo:
Stock stock = spy(Stock.class);
doReturn(100.00).when(stock).getPrice(); // Mock implementation
doReturn(200).when(stock).getQuantity(); // Mock implementation
// All other method call will use the real implementations
Un'altra possibilità potrebbe essere quella di utilizzare org.mockito.Mockito.CALLS_REAL_METHODS
, come ad esempio:
Stock MOCK_STOCK = Mockito.mock( Stock.class, CALLS_REAL_METHODS );
Ciò delega le chiamate non controllate a implementazioni reali.
Tuttavia, con il tuo esempio, credo che fallirà ancora, poiché l'implementazione di getValue()
fa affidamento quantity
e price
, piuttosto che getQuantity()
e getPrice()
, che è ciò che hai deriso.
Un'altra possibilità è quella di evitare del tutto le derisioni:
@Test
public void getValueTest() {
Stock stock = new Stock(100.00, 200);
double value = stock.getValue();
assertEquals("Stock value not correct", 100.00*200, value, .00001);
}