Pour répondre directement à votre question, oui, vous pouvez vous moquer de certaines méthodes sans en moquer d'autres. C'est ce qu'on appelle une simulation partielle . Voir la documentation Mockito sur les simulations partielles pour plus d'informations.
Pour votre exemple, vous pouvez faire quelque chose comme ceci dans votre 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
Dans ce cas, chaque implémentation de méthode est simulée, sauf indication contraire thenCallRealMethod()
dans la when(..)
clause.
Il y a aussi une possibilité dans l'autre sens avec espion au lieu de se moquer :
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
Dans ce cas, toutes les implémentations de méthodes sont les vraies, sauf si vous avez défini un comportement simulé avec when(..)
.
Il y a un écueil important lorsque vous utilisez when(Object)
avec espion comme dans l'exemple précédent. La vraie méthode sera appelée (car elle stock.getPrice()
est évaluée avant when(..)
lors de l'exécution). Cela peut être un problème si votre méthode contient une logique qui ne doit pas être appelée. Vous pouvez écrire l'exemple précédent comme ceci:
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
Une autre possibilité peut être d'utiliser org.mockito.Mockito.CALLS_REAL_METHODS
, comme:
Stock MOCK_STOCK = Mockito.mock( Stock.class, CALLS_REAL_METHODS );
Cela délègue des appels sans entrave à des implémentations réelles.
Cependant, avec votre exemple, je crois que ce sera toujours pas, depuis la mise en œuvre getValue()
repose sur quantity
et price
, plutôt quegetQuantity()
et getPrice()
, ce dont vous vous êtes moqué.
Une autre possibilité consiste à éviter complètement les moqueries:
@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);
}