Um Ihre Frage direkt zu beantworten: Ja, Sie können einige Methoden verspotten, ohne andere zu verspotten. Dies wird als partieller Schein bezeichnet . Weitere Informationen finden Sie in der Mockito-Dokumentation zu Teilverspottungen .
Für Ihr Beispiel können Sie in Ihrem Test Folgendes tun:
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 diesem Fall wird jede Methodenimplementierung verspottet, sofern thenCallRealMethod()
in der when(..)
Klausel nichts anderes angegeben ist.
Es gibt auch die Möglichkeit umgekehrt mit Spion statt Spott :
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 diesem Fall sind alle Methodenimplementierungen real, es sei denn, Sie haben ein verspottetes Verhalten mit definiert when(..)
.
Es gibt eine wichtige Gefahr, wenn Sie when(Object)
mit Spion wie im vorherigen Beispiel verwenden. Die reale Methode wird aufgerufen (da sie stock.getPrice()
zuvor when(..)
zur Laufzeit ausgewertet wird). Dies kann ein Problem sein, wenn Ihre Methode Logik enthält, die nicht aufgerufen werden sollte. Sie können das vorherige Beispiel folgendermaßen schreiben:
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
Eine andere Möglichkeit kann sein, zu verwenden org.mockito.Mockito.CALLS_REAL_METHODS
, wie zum Beispiel:
Stock MOCK_STOCK = Mockito.mock( Stock.class, CALLS_REAL_METHODS );
Dies delegiert nicht gestubbte Aufrufe an reale Implementierungen.
Doch mit Ihrem Beispiel, ich glaube , es wird immer noch fehlschlagen, da die Umsetzung getValue()
beruht auf quantity
und price
statt getQuantity()
und getPrice()
, das ist , was Sie verspottet haben.
Eine andere Möglichkeit besteht darin, Verspottungen insgesamt zu vermeiden:
@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);
}