Чтобы прямо ответить на ваш вопрос, да, вы можете издеваться над одними методами, не насмехаясь над другими. Это называется частичной имитацией . См. Документацию 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 );
Это делегирует unstubbed вызовы для реальных реализаций.
Тем не менее, с вашим примером, я считаю , что это будет по- прежнему терпят неудачу, так как реализация 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);
}