Щоб безпосередньо відповісти на ваше запитання, так, ви можете знущатися над одними методами, не знущаючись над іншими. Це називається частковим знущанням . Для отримання додаткової інформації дивіться документацію Mockito про часткові макети .
Для вашого прикладу ви можете зробити щось подібне у своєму тесті:
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
У цьому випадку кожна реалізація методу висміюється, якщо не вказано thenCallRealMethod()
в when(..)
пункті.
Також є можливість навпаки зі шпигуном замість макету :
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
У цьому випадку реалізація всіх методів є реальною, за винятком випадків, коли ви визначили знущальну поведінку when(..)
.
Є один важливий підводний камінь, коли ви використовуєтесь when(Object)
із шпигуном, як у попередньому прикладі. Буде викликано справжній метод (тому що stock.getPrice()
він оцінюється раніше when(..)
під час виконання). Це може бути проблемою, якщо ваш метод містить логіку, яку не слід викликати. Ви можете написати попередній приклад так:
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
Іншою можливістю може бути використання org.mockito.Mockito.CALLS_REAL_METHODS
, наприклад:
Stock MOCK_STOCK = Mockito.mock( Stock.class, CALLS_REAL_METHODS );
Це делегує незахищені дзвінки до реальних реалізацій.
Тим НЕ менше, з вашим прикладом, я вважаю , що це буде по- , як і раніше зазнають невдачі, так як реалізація getValue()
залежить від quantity
і price
, а не getQuantity()
та getPrice()
, що то , що ви глузували.
Інша можливість - взагалі уникнути знущань:
@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);
}