Um Ihre Frage direkt zu beantworten: Ja, Sie können einige Methoden verspotten, ohne andere zu verspotten. Dies wird als teilweise Attrappe . Siehe die Mockito-Dokumentation über partielle Mocks für weitere Informationen.
Für Ihr Beispiel können Sie in Ihrem Test etwa 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 nachgebildet, es sei denn, die thenCallRealMethod()
im when(..)
Klausel.
Es besteht auch die Möglichkeit des umgekehrten Weges mit Spionage anstelle von Nachahmung :
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 die echten, es sei denn, Sie haben ein gespottetes Verhalten mit when(..)
.
Es gibt einen wichtigen Fallstrick bei der Verwendung von when(Object)
mit spy wie im vorherigen Beispiel. Die eigentliche Methode wird aufgerufen (weil stock.getPrice()
wird ausgewertet, bevor when(..)
zur Laufzeit). Dies kann ein Problem sein, wenn Ihre Methode Logik enthält, die nicht aufgerufen werden sollte. Sie können das vorherige Beispiel wie folgt 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 wäre die Verwendung von org.mockito.Mockito.CALLS_REAL_METHODS
wie zum Beispiel:
Stock MOCK_STOCK = Mockito.mock( Stock.class, CALLS_REAL_METHODS );
Dies delegiert unbearbeitete Aufrufe an echte Implementierungen.
Bei Ihrem Beispiel glaube ich jedoch, dass es trotzdem scheitern wird, da die Implementierung von getValue()
stützt sich auf quantity
y price
statt getQuantity()
y getPrice()
Das ist es, worüber Sie sich lustig gemacht haben.
Eine andere Möglichkeit ist, Mocks ganz 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);
}